[제로베이스 데이터 취업스쿨] 23.07.10 스터디 노트

김준호·2023년 7월 10일
0
post-thumbnail

Naver API

1) 네이버 API 사용 등록

  • 네이버 개발 센터 (https://developers.naver.com/main/)
  • "서비스 API" 클릭
  • 조금 밑으로 내려 "오픈 API 이용 신청" 클릭
  • 왼쪽 카테고리에서 "애플리케이션 등록" 클릭
  • 애플리케이션 이름 정해주고 사용 API 선택, 이번에는 검색관련을 했다.
    검색, 데이터랩(쇼핑인사이트), 데이터랩(검색어트랜드)
  • 사용 API를 선택하면 밑에 "환경추가" 란이 더 생긴다.
    환경추가는 "WEB설정" 으로 해주고 웹서비스 URL은 "http://localhost"
    로 해준다.
  • 등록을 해주면 바로 Client ID와 Client Secret이 나온다.
    꼭 다른곳에 복사를 해두자, API를 사용할 때 마다 ID와 PW를 써줘야 하기 떄문이다.

2) 네이버 검색 API 사용

네이버 개발자 센터의 좋은 점은 각 API를 사용하는 예제들이 있다.

  • 개발자 센터 홈페이지 상단카테고리에 Document에 커서를 살짝 올리면
    오른쪽에 서비스API란이 있다.
  • 사용할 API를 선택하면 간단한 예제를 JAVA, Python 등으로 예제가 작성되있어 실행 할때 유용하게 사용가능하다. 우리는 검색을 사용 할것이다.

2-1) 검색 : 블로그(blog)

  • 네이버 검색 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"))

2-2)검색 : 책(book)

블로그 검색과 동일하지만 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)

2-3) 검색 카테고리

빨간 밑줄을 어떤것을 사용하냐 에 따라 검색할 카테고리를 변경할 수 있다.

  • 블로그 : blog
  • 책 : book
  • 영화 : movie
  • 네이버 카패 : cafe article
  • 쇼핑 : shop
  • 백과사전 : encyc

3) "몰스킨" 쇼핑 검색

몰스킨이라는 제품을 쇼핑에서 검색한 결과를 원하는 정보들만 수집해 액셀로 만들고 시각화 해보자.

  • 먼저, 전체적으로 순서에 따라 필요한 함수부터 간단히 설계
  • gen_search_url : 요청할 url 설정 함수
  • get_result_onpage : 검색 결과 가져오는 함수
  • get_fields : 가져온 데이터들 데이터프레임 형식으로 만들기
  • actMain : 검색한 모든 데이터 데이터프레임으로 저장
  • to_excel : 액셀파일로 저장

3-1)gen_search_url()

  • 요청할 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을 구성하는 요소(파라미터)들이니 참고 가능하다.


밑줄 친 부분을 만들어 주는 함수인 것이다.

3-2)get_result_onpage()

  • 검색 결과 가져오는 함수
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"]
'네이버'

3-3)get_firlds()

  • 가져온 데이터들 데이터프레임 형식으로 만들기
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 >"태그이다. 지워주자

3-3-1) delete_tag()

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)

3-4) actMain()

  • 검색한 모든 데이터 데이터프레임으로 저장
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()

3-5) to_excel()

  • 모듈이 다운이 안되어 있다면
    !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()
  • 지정된 경로에 엑셀파일 생성

4) 시각화

  • 모듈 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()

  • 네이버 몰이 압도적으로 많다.
profile
취업공부

0개의 댓글