본문 바로가기

API

네이버 API 통합 검색 트렌드의 월간 실 검색수 추정하기(파이썬)

반응형

네이버API 통합 검색 트렌드의 월별 상대 검색 결과를 절대 검색 결과로 추정해보겠습니다.

네이버 API의 통합검색 트렌드와 네이버 검색광고 API의 연관검색어를 이용하겠습니다.

 

1. 네이버 개발자센터 API 환경 확인하기

2. 네이버 검색광고 API 환경 확인하기

3. 통합검색 트렌드의 월간 검색수 추정하기

 

1. 네이버 개발자센터 API 환경 확인하기(통합검색어)

https://yenpa.tistory.com/10

 

[네이버 개발자센터 API] 연령대별 통합 검색어 트렌드(파이썬)

네이버 API의 통합 검색어를 이용해 연령대별 검색어 트렌트가 어떻게 다른지 확인해보겠습니다. 1. 네이버 API에서 통합 검색어 트렌드 데이터를 가져올 환경 확인(Skip가능) 2. 연령대별 통합 검

yenpa.tistory.com

 

2. 네이버 검색광고 API 환경 확인하기(월간검색수)

https://yenpa.tistory.com/12

 

네이버 검색광고 API 연관검색어 결과 가져오기(파이썬)

naver 검색광고 API에서 연관검색어에 대한 결과를 가져오는 방법을 확인해보겠습니다. 1. naver검색광고 API 가입 및 API key확인 2. 연관검색어 결과 확인 1. naver검색광고 API 가입 및 API key확인 가입이

yenpa.tistory.com

 

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축의 수치가 절대수치(월간 검색수)로 표시되는 것을 확인할 수 있습니다.

 

이상으로 통합트렌드의 상대 수치를 절대 수치로 변경하는 작업을 해봤습니다.

반응형