본문 바로가기

BLOG/오픈소스 리뷰기

[오픈소스 리뷰기] 네이버 데이터랩(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 이외에도 다른 요청변수를 입력할 수 있으며 아래 링크에서 확인할 수 있습니다. 

https://developers.naver.com/docs/serviceapi/datalab/search/search.md#%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0

 

통합 검색어 트렌드 - 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을 변경하여 다양한 데이터를 수집 및 시각화 해보세요😃