Naver API

YJ·2023년 4월 6일
0

▷ 오늘 학습 계획: EDA 강의(Naver API)

네이버 API 사용 등록

네이버 개발자 센터

  • Application 등록
  • 사용 API: 검색, 데이터랩(검색어트렌드), 데이터랩(쇼핑인사이트)
  • 환경추가: WEB 설정(http://localhost)
  • Client ID, Client Secret

네이버 검색 API 사용하기

개발 가이드
urllib: http 프로토콜에 따라서 서버의 요청/응답을 처리하기 위한 모듈
urllib.request: 클라이언트의 요청을 처리하는 모듈
urllib.parse: 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'))  #글자로 읽을 경우 decode 설정
else:
    print("Error Code:" + rescode)
  • HTTP 상태코드 출력

    response.getcode(), response.code, response.status

gen_search_url(generate url)
get_result_onpage(get data on one page)
get_fields(convert pandas data frame)
actMain(all data gathering)
toExcel(export to excel)

01_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

02_데이터 얻어오기

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 Success" % datetime.datetime.now())
    return json.loads(response.read().decode("utf-8"))
  • 테스트 하기

url = gen_search_url("shop", "몰스킨", 1, 5)
one_result = get_result_onepage(url)

one_result["items"][0]["title"]
one_result["items"][0]["link"]
one_result["items"][0]["lprice"]
one_result["items"][0]["mallName"]

03_검색 결과 가져오기

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)
  • 태그 없애는 함수 만들기

    "title"에 "b"태그도 함께 출력됨
def delete_tag(input_str):
    input_str = input_str.replace("<b>", "")
    input_str = input_str.replace("</b>", "")
    return input_str
  • 함수 적용하기

import pandas as pd

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)

04_모든 데이터 가져오기(반복문)

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)
  • "price" float로 형변환

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

05_엑셀로 저장하기

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

06_시각화 하기

import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib import rc
rc("font", family="Malgun Gothic")
%matplotlib inline

plt.figure(figsize=(15, 6))

sns.countplot(
    result_mol["mall"],
    data = result_mol,
    palette = "RdYlGn",
    order = result_mol["mall"].value_counts().index
)
plt.xticks(rotation=90)

plt.show()

▷ 내일 학습 계획: EDA 강의(인구분석)

[이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.]

0개의 댓글