Zerobase DS School
[데이터 취업 스쿨 스터디 노트] 데이터 수집 및 시각화 / Naver API 1 - 2
Sehe_e
2024. 8. 14. 21:56
Naver API
네이버 API 사용 등록
- 네이버 개발자 센터 ('https://developers.naver.com/main/') 에서 어플리케이션 등록 및 환경 추가
네이버 검색 API 사용하기
- 개발 가이드 https://developers.naver.com/docs/serviceapi/search/blog/blog.md 참고
- urllib: http 프로토콜에 따라서 서버의 요청/응답을 처리하기 위한 모듈
- urllib.request: 클라이언트의 요청을 처리하는 모듈
- urllib.parse: url 주소에 대한 분석
# 네이버 검색 API 예제 - 블로그 검색
import os
import sys
import urllib.request
client_id = 발급받은 클라이언트 id
client_secret = 발급받은 클라이언트 code
# 검색어 입력
encText = urllib.parse.quote("파이썬")
# 카테고리 종류 : 책(book), 블로그(blog), 카페(cafearticle), 쇼핑(shop), 백과사전(encyc)
# "https://openapi.naver.com/v1/search/(여기에 검색할 카테고리 입력)?query="
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)

상품 검색
1. gen_search_url (generate url)
2. get_result_onpage (Get data on one page)
3. get_fields (Convert pandas data frame)
4. delete_tag()
5. actMain (All data gathering)
6. toExcel (Export to Excel)
1. gen_search_url (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 = '&disp=' + str(disp_num)
return base + node + param_query + param_start + param_disp
gen_search_url('shop', 'TEST', 10, 3)

2. get_result_onpage (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 함수 사용해서 url 받아오기
url = gen_search_url('shop', '몰스킨', 1, 5)
# 2 함수에 url 넣어 검색 결과 json 받기
one_result = get_result_onpage(url)

one_result

3. get_fields (Convert pandas data frame)
one_result['items'][0]

상품 목록을 DataFrame으로 만들기
import pandas as pd
# 상품 목록을 DataFrame으로 변환
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()
# 위 dataframe의 title 내용, <b>몰스킨</b> 삭제하기
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

5. actMain()
result_mol = []
# 몰스킨데이터 1 ~ 1000페이지까지 전부 검색
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)
# concat으로 정리
result_mol = pd.concat(result_mol)
result_mol.info()

인덱스 정리, lprice 데이터 타입 변환
result_mol.reset_index(drop=True, inplace = True)
result_mol["lprice"] = result_mol["lprice"].astype("float")
result_mol.head()

6. to_excel()
# xlsxwriter 설치
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
# 시트 1 할당
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)
# 조건부서식 범위지정, 3 color scale로 값을 시각적으로 구분
worksheet.conditional_format("C2:C1001", {"type":"3_color_scale"})
writer.close()

상품 판매처 비율 시각화
import set_matplotlib_hangul
import matplotlib.pyplot as plt
import seaborn as sns
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()

내일의 학습 목표
EDA 인구 분석 1 - 3