네이버 개발자 센터의 좋은 점은 각 API를 사용하는 예제들이 있다.
- 네이버 검색 API 예제 블로그 검색
# 블로그 검색 import os import sys import urllib.request client_id = "Client ID" client_secret = "Client Secret" # 검색어 설정 encText = urllib.parse.quote("파이썬") # JSON 결과 url = "https://openapi.naver.com/v1/search/blog?query=" + encText # XML 결과 # url = "https://openapi.naver.com/v1/search/blog.xml?query=" + encText 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)
파이썬을 검색해서 나온 블로그글 결과가 출력된다.
- 만약 이상한 글자로 출력이 된다면 utf-8로 설정해주면 된다.
# 글자로 읽을 경우 , decode utf-8 설정 print(response_body.decode("utf-8"))
블로그 검색과 동일하지만 URL설정에서 blog를 book으로 변경만 해주면 된다.
# 네이버 검색 API 예제 - 책 검색 import os import sys import urllib.request client_id = "5N7xfk6F4kDJaX7hq1J3" client_secret = "Sq9FV3MxRR" 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)
빨간 밑줄을 어떤것을 사용하냐 에 따라 검색할 카테고리를 변경할 수 있다.
몰스킨이라는 제품을 쇼핑에서 검색한 결과를 원하는 정보들만 수집해 액셀로 만들고 시각화 해보자.
- 먼저, 전체적으로 순서에 따라 필요한 함수부터 간단히 설계
- gen_search_url : 요청할 url 설정 함수
- get_result_onpage : 검색 결과 가져오는 함수
- get_fields : 가져온 데이터들 데이터프레임 형식으로 만들기
- actMain : 검색한 모든 데이터 데이터프레임으로 저장
- to_excel : 액셀파일로 저장
- 요청할 url 설정 함수
- str()로 캐스팅 하는 이유는 문자열로 합치기 위해서
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
위 표는 네이버 개발자 센터에서 가져온 것이다. url을 구성하는 요소(파라미터)들이니 참고 가능하다.
밑줄 친 부분을 만들어 주는 함수인 것이다.
- 검색 결과 가져오는 함수
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"))
- 사용
- gen_search_url함수를 사용해 get_result_onpage에 넣어준다.
url = gen_search_url("shop","몰스킨",1, 5) one_result = get_result_onpage(url) one_result
딕셔너리 형태로 데이터 들이 가져와 진다.
이중에 items라는 키값 안에 value값들이 우리가 필요한 값들을 가지고 있다.
- 제목
one_result["items"][0]["title"]
'<b>몰스킨</b> 2024 위클리 18개월 다이어리 소프트커버 상품선택'
- 가격
one_result["items"][0]["lprice"]
'30260'
- 쇼핑몰 이름
one_result["items"][0]["mallName"]
'네이버'
- 가져온 데이터들 데이터프레임 형식으로 만들기
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
- delete_tag함수 적용
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)
- 검색한 모든 데이터 데이터프레임으로 저장
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)
- 지금까지 만든 함수들을 이용해서 100개의 정보를 10번 총 1000개의 정보 가져오기
- 정보 확인
result_mol.info()
- 인덱스가 99번까지 밖에 없다.
- 인덱스를 재정렬 해야 한다.
- 인덱스 재정렬
result_mol.reset_index(drop= True, inplace=True) result_mol.info()
- 인덱스가 0~999 총 1000개 확인
- lprice컬럼은 실수형으로 변형해주자.
result_mol["lprice"] = result_mol["lprice"].astype("float") result_mol.info()
- 모듈이 다운이 안되어 있다면
!pip install xlsxwriter
- 파이썬에서 액셀을 다루는 방법인데 한번 훝어 만 보자
- 현제의 주 목적은 naver api를 사용하는 예제를 다뤄보는것이다.
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()
- 지정된 경로에 엑셀파일 생성
- 모듈 import
import matplotlib.pyplot as plt from matplotlib import rc import seaborn as sns #한글 꺠짐 방지 rc("font", family="Malgun Gothic") #마이너스 기호 깨짐 방지 rc("axes",unicode_minus=False) #주피터 노트북 안에 그래프를 그리겠다. # %matplotlib inline get_ipython().run_line_magic("matplotlib", "inline")
- 쇼핑몰의 빈도수 시각화
plt.figure(figsize=(15,6)) sns.countplot( data = result_mol, x = result_mol["mall"], palette = "RdYlGn", order=result_mol["mall"].value_counts().index ) #가로로 mall이름을 출력하면 간격때문에 겹치니 90도로 돌려 안겹치게 #현제는 가로로 해도 안겹치게 간격이 자동으로 설정된다. plt.xticks(rotation=90) plt.show()
- 네이버 몰이 압도적으로 많다.