네이버API 통합 검색 트렌드의 월별 상대 검색 결과를 절대 검색 결과로 추정해보겠습니다.
네이버 API의 통합검색 트렌드와 네이버 검색광고 API의 연관검색어를 이용하겠습니다.
1. 네이버 개발자센터 API 환경 확인하기
2. 네이버 검색광고 API 환경 확인하기
3. 통합검색 트렌드의 월간 검색수 추정하기
1. 네이버 개발자센터 API 환경 확인하기(통합검색어)
2. 네이버 검색광고 API 환경 확인하기(월간검색수)
3. 통합검색 트렌드의 월간 검색수 추정하기
네이버 API의 통합검색어의 데이터를 가져오는 부분입니다.
client_id,와 client_secret은 본인 정보의 입력이 필요합니다.
#통합검색어 트렌드 확인
import os
import sys
import urllib.request
import json
import pandas as pd
import matplotlib.pyplot as plt
plt.rc('font', family='NanumGothic')
def gettrenddata(keyword1,keyword2,startDate,endDate):
client_id = "YOUR_CLIENT_ID"
client_secret = "YOUR_CLIENT_SECRET"
timeUnit='month'
keywordGroups=[
{'groupName':keyword1, 'keywords':[keyword1]},
{'groupName':keyword2, 'keywords':[keyword2]},
]
url = "https://openapi.naver.com/v1/datalab/search";
response_results_all = pd.DataFrame()
body_dict={} #검색 정보를 저장할 변수
body_dict['startDate']=startDate
body_dict['endDate']=endDate
body_dict['timeUnit']=timeUnit
body_dict['keywordGroups']=keywordGroups
body_dict['device']=device
body=str(body_dict).replace("'",'"') # ' 문자로는 에러가 발생해서 " 로 변환
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()
if(rescode==200):
response_body = response.read()
response_json = json.loads(response_body)
else:
print("Error Code:" + rescode)
# 결과데이터중 'data' 와 'title'만 따로 DataFrame으로 저장
response_results = pd.DataFrame()
for data in response_json['results']:
result=pd.DataFrame(data['data'])
result['title']=data['title']
response_results = pd.concat([response_results,result])
response_results_all = pd.concat([response_results_all,response_results])
#title별로 그래프를 그리기 위한부분
titles=response_results['title'].unique()
plt.figure(figsize=(6,2))
for title in titles:
data=response_results_all.loc[(response_results_all['title']==title) ,:]
plt.plot(data['period'],data['ratio'],label=title)
plt.xticks(rotation=90)
plt.legend()
plt.title('통합트렌드')
plt.show()
return response_results_all
검색 입력정보를 저장하는 변수입니다.
body_dict={}
실제 네이버에서 API 정보를 가져오는 부분입니다.
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()
if(rescode==200):
response_body = response.read()
response_json = json.loads(response_body)
else:
print("Error Code:" + rescode)
결과 데이터에서 'results'내의 'data'의 데이터만 DataFrame으로 저장하고,
'title'에 대한 정보를 추가했습니다.
response_results = pd.DataFrame()
for data in response_json['results']:
result=pd.DataFrame(data['data'])
result['title']=data['title']
response_results = pd.concat([response_results,result])
response_results_all = pd.concat([response_results_all,response_results])
네이버 광고 API에서 연관검색어의 월별 검색수를 가져오기 위한 부분입니다.
API_KEY, SECRET_KEY, CUSTOMER_ID는 본인의 데이터의 입력이 필요합니다.
#연관검색어의 월별검색수 확인
import os
import sys
import urllib.request
import json
import pandas as pd
import matplotlib.pyplot as plt
import time
import random
import requests
import hashlib
import hmac
import base64
class Signature:
@staticmethod
def generate(timestamp, method, uri, secret_key):
message = "{}.{}.{}".format(timestamp, method, uri)
hash = hmac.new(bytes(secret_key, "utf-8"), bytes(message, "utf-8"), hashlib.sha256)
hash.hexdigest()
return base64.b64encode(hash.digest())
def get_header(method, uri, api_key, secret_key, customer_id):
timestamp = str(round(time.time() * 1000))
signature = Signature.generate(timestamp, method, uri, secret_key)
return {'Content-Type': 'application/json; charset=UTF-8', 'X-Timestamp': timestamp,
'X-API-KEY': api_key, 'X-Customer': str(customer_id), 'X-Signature': signature}
def getrelkeyword(keyword1,keyword2):
BASE_URL = 'https://api.naver.com'
API_KEY = 'YOUR_API_KEY'
SECRET_KEY = 'YOUR_SECRET_KEY'
CUSTOMER_ID = 'YOUR_CUSTOMER_ID'
uri = '/keywordstool'
method = 'GET'
params={}
params['hintKeywords']=[keyword1,keyword2]
params['showDetail']='1'
r=requests.get(BASE_URL + uri, params=params,
headers=get_header(method, uri, API_KEY, SECRET_KEY, CUSTOMER_ID))
return pd.DataFrame(r.json()['keywordList'])
Signature class와 get_header 함수는 Header정보를 가져오는 부분으로 github 사이트의
'searchad-apidoc/python-sample/examples' 의 예제를 그대로 사용했습니다.
params는 입력정보이고, 결과를 요청후에 결과중 'keywordList'만 DataFrame으로 만들었습니다.
params={}
params['hintKeywords']=[keyword1,keyword2]
params['showDetail']='1'
r=requests.get(BASE_URL + uri, params=params,
headers=get_header(method, uri, API_KEY, SECRET_KEY, CUSTOMER_ID))
return pd.DataFrame(r.json()['keywordList'])
위의 함수들은 두개의 keyword에 대한 결과를 가져오는 함수입니다.
아래와 같이 '경복궁', '제주도'의 keyword에 대한 모바일에서의 결과를 확인해보겠습니다.
keyword1='경복궁'
keyword2='제주도'
startDate='2022-01-01'
endDate='2022-10-11'
device='mo' #'pc','mo'
trend=gettrenddata(keyword1,keyword2,startDate,endDate)
relkeyword=getrelkeyword(keyword1,keyword2)
통합트렌드의 상대수치에 대한 결과가 나왔습니다.
통합트렌드의 ratio 결과와 월간 검색수의 결과로 월별 검색수를 구합니다.
#keyword1,2에 대한 월간 퍼센트 정보 저장
keyword1_percent=trend.loc[trend['title']==keyword1,'ratio'].iloc[-1]
keyword2_percent=trend.loc[trend['title']==keyword2,'ratio'].iloc[-1]
if device=='pc':
colnum=1
elif device=='mo':
colnum=2
#keyword 1,2에 대한 pc/mo 의 월간검색수 저장
keyword1_count=relkeyword.iloc[0,colnum]
keyword2_count=relkeyword.iloc[1,colnum]
keyword1_1percent=keyword1_count/keyword1_percent
keyword2_1percent=keyword2_count/keyword2_percent
#통합 트렌드 데이터의 "ratio(%)"와 keyword별 "검색수/1%"의 곱으로 월별 검색수를 계산
trend_fin=trend.copy()
trend_fin.loc[trend_fin['title']==keyword1,(device+'검색수')]= \
keyword1_1percent*trend_fin.loc[trend_fin['title']==keyword1,'ratio']
trend_fin.loc[trend_fin['title']==keyword2,(device+'검색수')]= \
keyword2_1percent*trend_fin.loc[trend_fin['title']==keyword2,'ratio']
trend_fin=trend_fin.astype({(device+'검색수'):'int64'})
trend_fin
상대 수치인 ratio가 절대 검색수로 변경된 것을 확인할 수 있습니다.
통합트렌드에서 마지막 달의 keyword별 ratio을 가져와서,
#keyword1,2에 대한 월간 퍼센트 정보 저장
keyword1_percent=trend.loc[trend['title']==keyword1,'ratio'].iloc[-1]
keyword2_percent=trend.loc[trend['title']==keyword2,'ratio'].iloc[-1]
월간검색수의 keyword별 검색수를 구한 다음,
#keyword 1,2에 대한 pc/mo 의 월간검색수 저장
keyword1_count=relkeyword.iloc[0,colnum]
keyword2_count=relkeyword.iloc[1,colnum]
월간검색수 / ratio 로 키워드별 "월간검색수 / 1%" 의 결과를 구했습니다.
keyword1_1percent=keyword1_count/keyword1_percent
keyword2_1percent=keyword2_count/keyword2_percent
이결과로 월별 실제 검색수의 계산이 가능해집니다.
trend_fin=trend.copy()
trend_fin.loc[trend_fin['title']==keyword1,(device+'검색수')]= \
keyword1_1percent*trend_fin.loc[trend_fin['title']==keyword1,'ratio']
trend_fin.loc[trend_fin['title']==keyword2,(device+'검색수')]= \
keyword2_1percent*trend_fin.loc[trend_fin['title']==keyword2,'ratio']
마지막으로 그래프로 확인해보겠습니다.
#그래프 작성
from matplotlib.ticker import StrMethodFormatter
titles=trend_fin['title'].unique()
plt.figure(figsize=(6,2))
for title in titles:
data=trend_fin.loc[(trend_fin['title']==title) ,:]
plt.plot(data['period'],data[(device+'검색수')],label=title)
plt.xticks(rotation=90)
plt.gca().yaxis.set_major_formatter(StrMethodFormatter('{x:,.0f}'))
plt.legend()
plt.title('월별검색수')
plt.show()
통합트렌드와 추이는 비슷하게 나왔는데, y축의 수치가 절대수치(월간 검색수)로 표시되는 것을 확인할 수 있습니다.
이상으로 통합트렌드의 상대 수치를 절대 수치로 변경하는 작업을 해봤습니다.
'API' 카테고리의 다른 글
[SK Open API] 검색 지역의 월간 추정 여행자수 가져오기 (4) | 2022.10.14 |
---|---|
[SK Open API] 앱 등록 및 상품 구매 후 응답결과확인(무료) (4) | 2022.10.12 |
[SK Open API] 가입하기 (4) | 2022.10.11 |
네이버 검색광고 API 연관검색어 결과 가져오기(파이썬) (10) | 2022.10.10 |
네이버 검색 광고 API 가입 및 API KEY 확인하기 (4) | 2022.10.10 |