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