[오픈소스 리뷰기] 네이버 데이터랩(1) - 통합 검색어 트렌드
오픈소스 리뷰 : 슬기로운 오픈소스 사용법 리뷰해드립니다!
#9 네이버 데이터랩(1) - 통합 검색어 트렌드
안녕하세요. 디노랩스입니다!
이번시간에는 네이버에서 제공하는 데이터랩 API 활용법을 알아볼건데요. 데이터랩 API에서 제공하는 기능은 크게 검색어 데이터를 제공하는 통합 검색어 트렌드와 네이버 쇼핑 사용자의 클릭 데이터를 제공하는 쇼핑인사이트로 나뉘어집니다.
두 서비스는 모두 네이버 데이터랩 사이트(LINK)에서 제공하고 있지만, 데이터랩 API를 활용하면 직접 데이터를 수집하여 사용 목적에 알맞게 데이터를 가공할 수 있으며 반복 작업이 필요한 경우 조금 더 효율적으로 데이터를 수집할 수 있다는 장점이 있습니다.
이번 실습에서 작성한 코드를 활용하여 업무의 효율성을 높여보세요!!😀
네이버 데이터랩
네이버의 검색 트렌드 및 급상승검색어 이력, 쇼핑 카테고리별 검색 트렌드 제공
datalab.naver.com
오늘은 먼저 통합 검색어 트렌드! API 활용하는 방법 알려 드릴건데요.
그럼 시작해 볼까요? >_<
01_통합 검색어 트렌드
(1) API 이용신청
다른 API들과 마찬가지로 데이터랩 API를 활용하기 위해서는 API 이용 신청을 해야합니다.
아래 링크에 접속하여 로그인한 뒤 애플리케이션 등록 버튼을 눌러 아래 입력예시와 같이 입력하여 이용신청을 완료해주세요!
- 애플리케이션 이름은 임의로 설정해도 무관합니다.
- 웹 서비스 URL 은 아래와 같이 localhost로 설정하거나 활용하고 있는 주피터 노트북 url로 설정해주세요.
https://developers.naver.com/main/
NAVER Developers
네이버 오픈 API들을 활용해 개발자들이 다양한 애플리케이션을 개발할 수 있도록 API 가이드와 SDK를 제공합니다. 제공중인 오픈 API에는 네이버 로그인, 검색, 단축URL, 캡차를 비롯 기계번역, 음
developers.naver.com
<입력 예시>
신청이 완료되었다면 내 애플리케이션에서 API 사용을 위한 아이디와 키값을 확인할 수 있습니다.
(2) 통합 검색어 트렌드 조회
검색어, 조회기간, 성별, 연령대 등을 입력하여 통합 검색어 트렌드를 직접 조회해보겠습니다.
우선 필요한 라이브러리를 import 하고 생성한 API의 client ID와 client secret key 를 입력합니다.
# colab에서 한글 폰트 사용을 하기 위한 코드
import matplotlib.font_manager as fm
!apt-get -qq -y install fonts-nanum > /dev/null
fontpath = '/usr/share/fonts/truetype/nanum/NanumBarunGothic.ttf'
font = fm.FontProperties(fname=fontpath, size=9)
fm._rebuild()
# 한글 폰트 사용을 위해 런타임을 재시작합니다.
import os
os.kill(os.getpid(), 9)
import matplotlib.pyplot as plt
import matplotlib as mpl
import matplotlib.font_manager as fm
# 마이너스 표시 문제
mpl.rcParams['axes.unicode_minus'] = False
# 한글 폰트 설정
path = '/usr/share/fonts/truetype/nanum/NanumGothicBold.ttf'
font_name = fm.FontProperties(fname=path, size=18).get_name()
plt.rc('font', family=font_name)
fm._rebuild()
import os
import sys
import json
import urllib.request
import pandas as pd
import matplotlib.pyplot as plt
import plotly.express as px
import seaborn as sns
import warnings
warnings.filterwarnings(action='ignore')
client_id = "YOUR_CLIENT_ID" # 발급받은 CLIENT_ID 를 입력해주세요
client_secret = "YOUR_CLIENT_SECRET" # 발급받은 CLIENT_SECRET 을 입력해주세요
다음으로는 API를 호출할 url과 검색하고자하는 조건(body)을 입력합니다.
예제로는 2020년 "갤럭시", "아이폰"에 대한 모든 연령, 성별의 주간 검색 트렌드를 살펴보겠습니다.
url = "https://openapi.naver.com/v1/datalab/search"
startDate = "2020-01-01" # 조회 기간 시작 날짜
endDate = "2020-12-31" # 조회 기간 종료 날짜
timeUnit = "week" # 구간 단위
keywordGroups = [
{"groupName":"갤럭시", "keywords":["갤럭시", "galaxy"]},
{"groupName":"아이폰", "keywords":["아이폰", "iphone"]},
] # 주제어와 주제어에 해당하는 검색어 묶음 쌍의 배열 (최대 5개)
## groupName : 주제어. 검색어 묶음을 대표하는 이름
## keywords : 주제어에 해당하는 검색어 (최대 20개)
위에서 입력한 조건은 데이터랩에서 아래와 같와 같이 입력한 것과 동일한 조건입니다.
startDate, endDate, timeUnit, keywordGroups 이외에도 다른 요청변수를 입력할 수 있으며 아래 링크에서 확인할 수 있습니다.
통합 검색어 트렌드 - Datalab
통합 검색어 트렌드 통합 검색어 트렌드 개요 개요 통합 검색어 트렌드 API 개요 통합 검색어 트렌드 API는 네이버 데이터랩의 검색어 트렌드를 API로 실행할 수 있게하는 RESTful API입니다. 주제어
developers.naver.com
조건을 입력했다면 이를 파이썬 딕셔너리 객체로 만든 뒤, JSON 문자열로 변환하여 API에 전달합니다.
body = {
"startDate": startDate,
"endDate": endDate,
"timeUnit": timeUnit,
"keywordGroups": keywordGroups,
}
body = json.dumps(body)
request = urllib.request.Request(url)
request.add_header("X-Naver-Client-Id",client_id)
request.add_header("X-Naver-Client-Secret",client_secret)
request.add_header("Content-Type","application/json")
response = urllib.request.urlopen(request, data=body.encode("utf-8"))
rescode = response.getcode()
print(rescode)
rescode 가 위와 같이 200이 나왔다면 정상적으로 API를 통해 데이터를 반환한 것입니다.
반환된 데이터는 어떤 정보를 담고 있을까요?
JSON 형태로 반환된 데이터를 파이썬 딕셔너리 객체로 변환하여 확인해봅시다!
from pprint import pprint
result = json.loads(response.read())
pprint(result)
반환된 데이터는 다음과 같은 정보를 담고 있습니다.
- startDate : 조회 기간 시작 날짜
- endDate : 조회 기간 종료 날짜
- timeUnit : 구간 단위
- results : 반환된 정보 전체를 담고 있는 결과값
- title : 주제어
- keywords : 주제어에 해당하는 검색어
- data : 검색 트렌드 데이터를 담고 있는 결과값
- period : 구간별 시작 날짜
- ratio : 구간별 검색량의 상대적 비율
더 자세한 내용은 아래 링크에서 확인할 수 있습니다!
https://developers.naver.com/docs/serviceapi/datalab/search/search.md#%EC%9D%91%EB%8B%B5
통합 검색어 트렌드 - Datalab
통합 검색어 트렌드 통합 검색어 트렌드 개요 개요 통합 검색어 트렌드 API 개요 통합 검색어 트렌드 API는 네이버 데이터랩의 검색어 트렌드를 API로 실행할 수 있게하는 RESTful API입니다. 주제어
developers.naver.com
반환된 정보를 조금 더 보기 쉽게 데이터프레임 형식으로 변환해보겠습니다.
if(rescode==200):
df = pd.DataFrame(result['results'][0]['data'])[['period']]
for i in range(len(keywordGroups)):
tmp = pd.DataFrame(result['results'][i]['data'])
tmp = tmp.rename(columns={'ratio': result['results'][i]['title']})
df = pd.merge(df, tmp, how='left', on=['period'])
df = df.rename(columns={'period': '날짜'})
df['날짜'] = pd.to_datetime(df['날짜'])
else:
print("Error Code:" + rescode)
df.head()
딕셔너리 형태에 담긴 데이터를 데이터프레임으로 변환했습니다.
이제 이를 활용하여 시각화를 진행해보겠습니다.
columns = df.columns[1:]
n_col = len(columns)
fig = plt.figure(figsize=(12,6))
plt.title('주 별 검색어 트렌드', size=20, weight='bold')
for i in range(n_col):
sns.lineplot(x=df['날짜'], y=df[columns[i]], label=columns[i])
plt.ylabel("검색량")
plt.legend(loc='upper right')
plt.show()
시각화 결과 2020년 한 해동안은 "갤럭시"보다 "아이폰"을 검색한 사용자가 훨씬 많으며 아이폰12 발표 시기였던 2020년 10월에는 검색량이 크게 증가한 것을 확인할 수 있습니다.
추가로 아래 사진은 동일한 조건으로 네이버 데이터랩에서 살펴본 그래프이며 우리가 API를 통해 불러온 데이터가 네이버 데이터랩 사이트에서 제공하는 데이터와 동일한 것을 확인할 수 있습니다.
(참고) 클래스로 구현하기
이제 위 코드를 활용하여 찾고자하는 주제어의 검색 트렌드를 손쉽게 수집하고 시각화 할 수 있습니다!
그럼 조금 더 편리한 사용을 위해 클래스를 만들어보겠습니다.
class NaverDataLabOpenAPI():
"""
네이버 데이터랩 오픈 API 컨트롤러 클래스
"""
def __init__(self, client_id, client_secret):
"""
인증키 설정 및 검색어 그룹 초기화
"""
self.client_id = client_id
self.client_secret = client_secret
self.keywordGroups = []
self.url = "https://openapi.naver.com/v1/datalab/search"
def add_keyword_groups(self, group_dict):
"""
검색어 그룹 추가
"""
keyword_gorup = {
'groupName': group_dict['groupName'],
'keywords': group_dict['keywords']
}
self.keywordGroups.append(keyword_gorup)
print(f">>> Num of keywordGroups: {len(self.keywordGroups)}")
def get_data(self, startDate, endDate, timeUnit, device, ages, gender):
"""
요청 결과 반환
"""
# Request body
body = json.dumps({
"startDate": startDate,
"endDate": endDate,
"timeUnit": timeUnit,
"keywordGroups": self.keywordGroups,
"device": device,
"ages": ages,
"gender": gender
}, ensure_ascii=False)
# Results
request = urllib.request.Request(self.url)
request.add_header("X-Naver-Client-Id",self.client_id)
request.add_header("X-Naver-Client-Secret",self.client_secret)
request.add_header("Content-Type","application/json")
response = urllib.request.urlopen(request, data=body.encode("utf-8"))
rescode = response.getcode()
if(rescode==200):
# Json Result
result = json.loads(response.read())
df = pd.DataFrame(result['results'][0]['data'])[['period']]
for i in range(len(self.keywordGroups)):
tmp = pd.DataFrame(result['results'][i]['data'])
tmp = tmp.rename(columns={'ratio': result['results'][i]['title']})
df = pd.merge(df, tmp, how='left', on=['period'])
self.df = df.rename(columns={'period': '날짜'})
self.df['날짜'] = pd.to_datetime(self.df['날짜'])
else:
print("Error Code:" + rescode)
return self.df
def plot_trend(self):
"""
검색어 트렌드 그래프 출력
"""
colList = self.df.columns[1:]
n_col = len(colList)
fig = plt.figure(figsize=(12,6))
plt.title('검색어 트렌드', size=20, weight='bold')
for i in range(n_col):
sns.lineplot(x=self.df['날짜'], y=self.df[colList[i]], label=colList[i])
plt.ylabel("검색량")
plt.legend(loc='upper right')
return fig
이제 NaverDataLabOpenAPI 클래스를 활용한다면 아래 코드와 같이 검색 트렌드 수집, 시각화 과정을 하나의 모듈로 손쉽게 사용할 수 있습니다.
# API 인증 정보 설정
client_id = "YOUR_CLIENT_ID" # 발급받은 CLIENT_ID 를 입력해주세요
client_secret = "YOUR_CLIENT_SECRET" # 발급받은 CLIENT_SECRET 을 입력해주세요
# 요청 파라미터 설정
startDate = "2020-01-01"
endDate = "2020-12-31"
timeUnit = 'date'
device = ''
ages = []
gender = ''
# 검색하고자 하는 groupName과 keywords를 아래 형식과 같이 입력합니다.
keyword_group_set = {
'keyword_group_1': {'groupName': "애플", 'keywords': ["애플","Apple","AAPL"]},
'keyword_group_2': {'groupName': "아마존", 'keywords': ["아마존","Amazon","AMZN"]},
'keyword_group_3': {'groupName': "구글", 'keywords': ["구글","Google","GOOGL"]},
'keyword_group_4': {'groupName': "테슬라", 'keywords': ["테슬라","Tesla","TSLA"]},
'keyword_group_5': {'groupName': "페이스북", 'keywords': ["페이스북","Facebook","FB"]}
}
# FAANG 이라는 인스턴스를 생성합니다.
FAANG = NaverDataLabOpenAPI(client_id=client_id, client_secret=client_secret)
# add_keyword_groups 함수를 사용하여 keyword 그룹을 추가합니다.
FAANG.add_keyword_groups(keyword_group_set['keyword_group_1'])
FAANG.add_keyword_groups(keyword_group_set['keyword_group_2'])
FAANG.add_keyword_groups(keyword_group_set['keyword_group_3'])
FAANG.add_keyword_groups(keyword_group_set['keyword_group_4'])
FAANG.add_keyword_groups(keyword_group_set['keyword_group_5'])
# 반환된 데이터를 데이터프레임으로 저장합니다.
df = FAANG.get_data(startDate, endDate, timeUnit, device, ages, gender)
# 데이터 프레임을 확인합니다.
df
아까와 마찬가지로 딕셔너리 형태에 담긴 데이터를 데이터프레임으로 변환했습니다.
이제 이를 활용하여 시각화 시켜볼게요!
# 트렌드 데이터를 시각화 합니다.
fig = FAANG.plot_trend()
여기까지! 잘 따라오셨나요?ㅎㅎ
위에서 설정한 파라미터와 검색어 group을 변경하여 다양한 데이터를 수집 및 시각화 해보세요😃