Naver API

InSung-Na·2023년 2월 6일
0
post-thumbnail

해당 글은 제로베이스데이터스쿨 학습자료를 참고하여 작성되었습니다

📌Naver API


📌프로젝트 목표

몰 스킨 데이터 정리 및 시각화


📌프로젝트 절차

  1. 네이버 API 등록
  2. 네이버 검색 API 사용하기
  3. 몰스킨 검색하기 및 정리
  4. 데이터 시각화

📌1. 네이버 API 등록

네이버개발자 -> 서비스 API


오픈 API 이용 신청


Application 등록


Application 정보 확인


📌2. 네이버 검색 API 사용하기

Documents -> 서비스 API -> 검색


스크롤을 내려서 Python 검색 코드 가져오기


블로그 검색

  • url주소를 보면 blog가 들어가 있는데 이를 수정하면 원하는 종류의 결과를 얻을 수 있다
    • ex)book, shop, movie
  • quote("파이썬")으로 입력된 부분에 원하는 검색내용을 입력한다
# 네이버 검색 API예제는 블로그를 비롯 전문자료까지 호출방법이 동일하므로 blog검색만 대표로 예제를 올렸습니다.
# 네이버 검색 Open API 예제 - 블로그 검색
import os
import sys
import urllib.request

client_id = "YOUR_ID"
client_secret = "YOUR_PASSWORD"

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)


책 검색

import os
import sys
import urllib.request

client_id = "YOUR_ID"
client_secret = "YOUR_PASSWORD"

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)


📌3. 몰 스킨 검색하기

3.1. Generate 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)


3.2. Get data on one page

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"))
# 1~5페이지의 몰스킨 검색 url 생성
url = gen_search_url("shop", "몰스킨", 1, 5)
one_result = get_result_onpage(url)
# 검색실시
one_result


3.3. Convert pandas data frame

one_result["items"][0]


데이터의 결과에 태그가 존재함

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)


태그 삭제

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 = [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)


3.4. All data gathering

result_mol = [] 

for n in range(1, 1000, 100):
    url = gen_search_url("shop", "몰스킨", n, 100)
    json_result = get_result_onpage(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.info()


가격 형변환 obejct -> float

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


3.5. Export to Excel

# !pip install xlsxwriter
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)

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


📌4. 데이터 시각화

# 한글설정
from matplotlib import rc
import matplotlib.pyplot as plt
import seaborn as sns

rc('font', family='Malgun Gothic')
%matplotlib inline

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) # x축 회전
plt.show()

0개의 댓글