네이버 API 1 ~ 2

yeoni·2023년 5월 10일
0

1. 네이버 API 사용하기

  • 네이버 서비스 API 검색 Documents: https://developers.naver.com/docs/serviceapi/search/blog/blog.md
  • HTTP 상태
  • 글자로 읽을 경우, decode utf-8 설정
  • url에 넣으면 해당 카테고리로 검색: 블로그(blog), 책(book), 카페(cafearticle, 전체공개 내용만), 쇼핑(shop), 백과사전(encyc)
  • urllib.parse: urllib 라이브러리 기능 중 url 주소에 대한 분석 기능
# 다음은 검색 API로 블로그 검색 결과를 조회하는 구현 예제입니다. 
# 검색 API의 다른 작업을 구현하는 방법도 이 구현 예제와 유사하기 때문에 이 구현 예제를 참고하면 검색 API를 구현할 수 있습니다.
# 네이버 검색 API 예제 - 블로그 검색
import os
import sys
import urllib.request
client_id = "client_id"
client_secret = "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)
    
# HTTP 상태
# response, response.getcode(), response.code, response.status

2. 상품검색

  • 몰스킨
import os
import sys
import urllib.request
client_id = "client_id"
client_secret = "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

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

(2) get_result_onepage()

import json
import datetime
def get_result_onepage(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 Suceess" % datetime.datetime.now())
    return json.loads(response.read().decode("utf-8"))

(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"]]
    mall_name = [each["mallName"] for each in json_data["items"]]

    result_pd = pd.DataFrame({
        "title": title,
        "link": link,
        "lprice": lprice,
        "mall": mall_name,
    }, columns=["title", "lprice", "link", "mall"])
    return result_pd
    
get_fields(one_result) # 테스트용

(4) delete_tag()

import pandas as pd

def delete_tag(input_str):
    input_str = input_str.replace("<b>", "")
    input_str = input_str.replace("</b>", "")
    return input_str
    
def get_fields(json_data):
    title = [delete_tag(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"]]
    mall_name = [each["mallName"] for each in json_data["items"]]

    result_pd = pd.DataFrame({
        "title": title,
        "link": link,
        "lprice": lprice,
        "mall": mall_name,
    }, columns=["title", "lprice", "link", "mall"])
    return result_pd
    
get_fields(one_result) # 테스트용

(5) actMain()

  • reset_index(): 행 인덱스 초기화, 재배열
    • drop=True → 기존 인덱스를 버리고 재배열
    • inplace=True → 현재 데이터 프레임에 배치
result_mol = []
for n in range(1, 1000, 100):
    url = gen_search_url("shop", "몰스킨", n, 100)
    json_result = get_result_onepage(url)
    pd_result = get_fields(json_result)
    result_mol.append(pd_result)
    
result_mol = pd.concat(result_mol)
result_mol.reset_index(drop=True, inplace=True)

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

(6) to_excel()

!pip install xlsxwriter

writer = pd.ExcelWriter("../data/05_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)

worksheet.conditional_format("C2:C1001", {"type":"3_color_scale"})
writer.save()

(7) 시각화

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('Unkown system sorry')


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()


Reference
1) 제로베이스 데이터스쿨 강의자료
2) https://yganalyst.github.io/data_handling/Pd_2/

profile
데이터 사이언스 / just do it

0개의 댓글