[EDA] Naver API - 검색을 통한 분석

박미영·2023년 4월 7일
0

DataSchool StudyNote - EDA

목록 보기
17/19

📌Naver API 사용 등록

  • 네이버 개발자 센터
  • https://developers.naver.com/main/
  • Application
    • 어플리케이션 등록
    • 어플리케이션 이름 ds_study
    • 사용 API
      • 검색
      • 데이터랩(검색어트렌드)
      • 데이터랩(쇼핑인사이트)
    • 환경추가



  • 네이버 개발자 센터



📌네이버 검색 API 사용하기




📍검색: 블로그(blog)

  • urllib: http 프로토콜에 따라서 서버의 요청/응답을 처리하기 위한 모듈
  • urllib.request: 클라이언트의 요청을 처리하는 모듈
  • urllib.parser: url 주소에 대한 분석
# 네이버 검색 API 예제 - 블로그 검색
import os
import sys
import urllib.request

client_id = "YOUR_CLIENT_ID"
client_secret = "YOUR_CLIENT_SECRET"

encText = urllib.parse.quote("파이썬")
url = "https://openapi.naver.com/v1/search/blog?query=" + encText # JSON 결과
# url = "https://openapi.naver.com/v1/search/blog.xml?query=" + encText # XML 결과
request = urllib.request.Request(url)
request.add_header("X-Naver-Client-Id",client_id)
request.add_header("X-Naver-Client-Secret",client_secret)
response = urllib.request.urlopen(request)
rescode = response.getcode()
if(rescode==200):
    response_body = response.read()
    print(response_body.decode('utf-8'))
else:
    print("Error Code:" + rescode)



  • 코드 확인
response, response.getcode(), response.status, response.code


  • 글자로 읽을 경우, decode utf-8 설정
# 글자로 읽을 경우, decode utf-8 설정
print(response_body.decode("utf-8"))



📍검색: 책(book)

# 네이버 검색 API 예제 - 책 검색
import os
import sys
import urllib.request

client_id = ""
client_secret = ""

encText = urllib.parse.quote("파이썬")
url = "https://openapi.naver.com/v1/search/book?query=" + encText # JSON 결과
# url = "https://openapi.naver.com/v1/search/blog.xml?query=" + encText # XML 결과
request = urllib.request.Request(url)
request.add_header("X-Naver-Client-Id",client_id)
request.add_header("X-Naver-Client-Secret",client_secret)
response = urllib.request.urlopen(request)
rescode = response.getcode()
if(rescode==200):
    response_body = response.read()
    print(response_body.decode('utf-8'))
else:
    print("Error Code:" + rescode)



📍검색: 영화(movie)

# 네이버 검색 API 예제 - 영화 검색
import os
import sys
import urllib.request

client_id = ""
client_secret = ""

encText = urllib.parse.quote("파이썬")
url = "https://openapi.naver.com/v1/search/movie?query=" + encText # JSON 결과
# url = "https://openapi.naver.com/v1/search/blog.xml?query=" + encText # XML 결과
request = urllib.request.Request(url)
request.add_header("X-Naver-Client-Id",client_id)
request.add_header("X-Naver-Client-Secret",client_secret)
response = urllib.request.urlopen(request)
rescode = response.getcode()
if(rescode==200):
    response_body = response.read()
    print(response_body.decode('utf-8'))
else:
    print("Error Code:" + rescode)

강의에서는 그냥 movie 넣을 때 잘 실행됐는데 나는 404에러가 발생했다.



📍검색: 카페(cafe)

# 네이버 검색 API 예제 - 카페 검색
import os
import sys
import urllib.request

client_id = ""
client_secret = ""

encText = urllib.parse.quote("파이썬")
url = "https://openapi.naver.com/v1/search/cafearticle?query=" + encText # JSON 결과
# url = "https://openapi.naver.com/v1/search/blog.xml?query=" + encText # XML 결과
request = urllib.request.Request(url)
request.add_header("X-Naver-Client-Id",client_id)
request.add_header("X-Naver-Client-Secret",client_secret)
response = urllib.request.urlopen(request)
rescode = response.getcode()
if(rescode==200):
    response_body = response.read()
    print(response_body.decode('utf-8'))
else:
    print("Error Code:" + rescode)



📍검색: 쇼핑(shop)

# 네이버 검색 API 예제 - 쇼핑 검색
import os
import sys
import urllib.request

client_id = ""
client_secret = ""

encText = urllib.parse.quote("파이썬")
url = "https://openapi.naver.com/v1/search/shop?query=" + encText # JSON 결과
# url = "https://openapi.naver.com/v1/search/blog.xml?query=" + encText # XML 결과
request = urllib.request.Request(url)
request.add_header("X-Naver-Client-Id",client_id)
request.add_header("X-Naver-Client-Secret",client_secret)
response = urllib.request.urlopen(request)
rescode = response.getcode()
if(rescode==200):
    response_body = response.read()
    print(response_body.decode('utf-8'))
else:
    print("Error Code:" + rescode)



📍검색: 백과사전(encyc)

# 네이버 검색 API 예제 - 백과사전 검색
import os
import sys
import urllib.request

client_id = ""
client_secret = ""

encText = urllib.parse.quote("파이썬")
url = "https://openapi.naver.com/v1/search/encyc?query=" + encText # JSON 결과
# url = "https://openapi.naver.com/v1/search/blog.xml?query=" + encText # XML 결과
request = urllib.request.Request(url)
request.add_header("X-Naver-Client-Id",client_id)
request.add_header("X-Naver-Client-Secret",client_secret)
response = urllib.request.urlopen(request)
rescode = response.getcode()
if(rescode==200):
    response_body = response.read()
    print(response_body.decode('utf-8'))
else:
    print("Error Code:" + rescode)



📌상품 검색(feat. 몰스킨)

# 네이버 검색 API 예제 - 쇼핑 검색
import os
import sys
import urllib.request

client_id = ""
client_secret = ""

encText = urllib.parse.quote("몰스킨")
url = "https://openapi.naver.com/v1/search/shop?query=" + encText # JSON 결과
# url = "https://openapi.naver.com/v1/search/blog.xml?query=" + encText # XML 결과
request = urllib.request.Request(url)
request.add_header("X-Naver-Client-Id",client_id)
request.add_header("X-Naver-Client-Secret",client_secret)
response = urllib.request.urlopen(request)
rescode = response.getcode()
if(rescode==200):
    response_body = response.read()
    print(response_body.decode('utf-8'))
else:
    print("Error Code:" + rescode)



(1) gen_search_url

url 생성 부분 구현

def gen_search_url(api_node, search_text, start_num, disp_num):
    base = "https://openapi.naver.com/v1/search"
    node = "/" + api_node + '.json'
    param_query = "?query=" + urllib.parse.quote(search_text)
    param_start = "&start=" + str(start_num)
    param_disp = "&display=" + str(disp_num)

    return base + node + param_query + param_start + param_disp
gen_search_url("shop", "TEST", 10, 3)



(2) get_result_onpage

import json
import datetime

def get_result_onpage(url):
    request = urllib.request.Request(url)
    request.add_header("X-Naver-Client-Id",client_id)
    request.add_header("X-Naver-Client-Secret",client_secret)
    response = urllib.request.urlopen(request)
    print("[%s] Url Request Success" % datetime.datetime.now())
    return json.loads(response.read().decode("utf-8"))
url = gen_search_url("shop", "몰스킨", 1, 5) # 쇼핑에서 몰스킨 검색, 첫번째 페이지 5 개 
one_result = get_result_onpage(url)
one_result



one_result["items"][0]

one_result["items"][0]["title"]



(3) get_fields()

import pandas as pd

def get_fields(json_data):
    title = [each["title"] for each in json_data["items"]]
    link = [each["link"] for each in json_data["items"]]
    lprice = [each["lprice"] for each in json_data["items"]]
    mallName = [each["mallName"] for each in json_data["items"]]

    result_pd = pd.DataFrame({
        "title": title,
        "link": link,
        "lprice": lprice,
        "mall": mallName,
    }, columns=["title", "lprice", "link", "mall"])
    
    return result_pd
get_fields(one_result)



(4) delete_tag()

html 코드 제거 함수

def delete_tag(input_str):
    input_str = input_str.replace("<b>", "")
    input_str = input_str.replace("</b>", "")
    
    return input_str



  • get_fields 함수에 적용
import pandas as pd

def get_fields(json_data):
    title = [delete_tag(each["title"]) for each in json_data["items"]]
    link = [delete_tag(each["link"]) for each in json_data["items"]]
    lprice = [delete_tag(each["lprice"]) for each in json_data["items"]]
    mallName = [delete_tag(each["mallName"]) for each in json_data["items"]]

    result_pd = pd.DataFrame({
        "title": title,
        "link": link,
        "lprice": lprice,
        "mall": mallName,
    }, columns=["title", "lprice", "link", "mall"])
    
    return result_pd
get_fields(one_result)



(5) actMain()

(1-3) 실행

url = gen_search_url("shop", "몰스킨", 1, 5)
json_result = get_result_onpage(url)
pd_result = get_fields(json_result)
pd_result



result_mol = []

for n in range(1, 1000, 100):
    url = gen_search_url("shop", "몰스킨", n, 100)    # url 생성
    json_result = get_result_onpage(url)        # json 응답
    pd_result = get_fields(json_result)         # 응답 -> 데이터프레임

    result_mol.append(pd_result)

result_mol = pd.concat(result_mol)      # 모아주기



result_mol.info()



- 인덱스 정리

0-99가 반복 되고 있다. drop=True를 적용하여 인덱스 정리한다.

result_mol.reset_index(drop=True, inplace=True) # drop=True 인덱스 2개 사라짐
result_mol

result_mol.info()



- type 변경(object -> float)

result_mol["lprice"] = result_mol["lprice"].astype("float")
result_mol.info()



📌엑셀 저장

- 설치

!pip install xlsxwriter
  • 설치 안 되어있는 경우

  • 이미 설치 되어있는 경우



- 엑셀 저장: to_excel()

writer = pd.ExcelWriter("../data/06_molskin_diary_in_naver_shop.xlsx", engine="xlsxwriter")
result_mol.to_excel(writer, sheet_name="Sheet1")

workbook = writer.book
worksheet = writer.sheets["Sheet1"]
# 컬럼별 크기 조절
worksheet.set_column("A:A", 4)  
worksheet.set_column("B:B", 60)
worksheet.set_column("C:C", 10)
worksheet.set_column("D:D", 10)
worksheet.set_column("E:E", 50)
worksheet.set_column("F:F", 10)

# C컬럼 가격별 셀 색상
worksheet.conditional_format("C2:C1001", {"type": "3_color_scale"})
writer.save()



📌시각화

import matplotlib.pyplot as plt
import seaborn as sns
import platform
from matplotlib import font_manager, rc

get_ipython().run_line_magic("matplotlib", "inline")

path="C:/Windows/Fonts/malgun.ttf"

if platform.system() == "Darwin":
    rc("font", family="Arial Unicode MS")
elif platform.system() == "Windows":
    font_name = font_manager.FontProperties(fname=path).get_name()
    rc("font", family=font_name)
else:
    print("Unknown system. sorry~")



- countplot

plt.figure(figsize=(15, 6))
sns.countplot(
    x=result_mol["mall"],
    data=result_mol,
    palette="RdYlGn",
    order=result_mol["mall"].value_counts().index,
)
plt.xticks(rotation=90)
plt.show()




"이 글은 제로베이스 데이터 취업 스쿨 강의를 듣고 작성한 내용으로 제로베이스 데이터 취업 스쿨 강의 자료 일부를 발췌한 내용이 포함되어 있습니다."

0개의 댓글