본문 바로가기

API

[네이버 SK API] 월별 검색수와 여행자수 비교하기(파이썬)

반응형

네이버 API와 SK의 API를 이용해서 여행지의 월별 검색수와 여행자수의 데이터를 비교해보겠습니다.
아래 1, 2번의 데이터를 활용해서 만들었습니다.

1. 통합 검색 트렌드의 월간 실 검색수 추정하기
2. [SK Open API] 검색 지역의 월간 추정 여행자수 가져오기
3. 월별 검색수와 여행자수 비교하기

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

https://yenpa.tistory.com/15

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

네이버API 통합 검색 트렌드의 월별 상대 검색 결과를 절대 검색 결과로 추정해보겠습니다. 네이버 API의 통합검색 트렌드와 네이버 검색광고 API의 연관검색어를 이용하겠습니다. 1. 네이버 개발

yenpa.tistory.com

2. [SK Open API] 검색 지역의 월간 추정 여행자수 가져오기

https://yenpa.tistory.com/17

[SK Open API] 검색 지역의 월간 추정 여행자수 가져오기

SK Open API의 국내여행을 이용해 검색하는 지역의 월간 추정 여행자수를 구해보겠습니다. 1. API 가져 올 환경 확인하기 2. 월간 추정 여행자수 가져오기 1. API 가져 올 환경 확인하기 https://yenpa.tistor

yenpa.tistory.com


3. 월별 검색수와 여행자수 비교하기

통합트렌드에서 월간 실 검색수 추정하는 코드입니다.
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])
    
    return response_results_all

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'])

SK API의 월간 여행자수 추정데이터를 불러오는 코드입니다.

#검색어의 여행자수 구해오기
import requests
import pandas as pd


# 여행지 리스트 수집
def gettravellist(appkey):
    url = "https://apis.openapi.sk.com/puzzle/travel?type=sig"

    headers = {
        "accept": "application/json",
        "appkey": appkey
    }

    response = requests.get(url, headers=headers)

    result=response.json()

    return pd.DataFrame(result['contents'])


# 검색 지역의 월간 여행자수 구하기
def gettraveller_bymonth(appkey,districtCode,districtName,yearmonth):
    url = "https://apis.openapi.sk.com/puzzle/traveler-count/raw/monthly/districts/" + \
        districtCode + "?" + "yearMonth=" + yearmonth + \
        "&gender=all&ageGrp=all&companionType=all"

    headers = {
        "accept": "application/json",
        "appkey": appkey
    }

    response = requests.get(url, headers=headers)
    
    #
    result=response.json()
    
    travelerCount=result['contents']['raw']['travelerCount']
    yearMonth=result['contents']['raw']['yearMonth']
    
    df=pd.DataFrame({'districtCode':[districtCode],'districtName':[districtName],
                     'yearMonth':[yearMonth],'travelerCount':[travelerCount]})
    
    df['date']=pd.to_datetime(df['yearMonth'], format='%Y%m')
    
    return(df.set_index('date'))
    
    def gettraveller(appkey,keywords,yearmonths):
    #여행지 리스트 가져오기
    df_list=gettravellist(appkey)

    #여행지가 여러개일 경우 하나의 DataFrame에 저장하기
    result_all=pd.DataFrame()
    
    for keyword in keywords:
        #여행지에서 검색어를 포함한 지역들을 가져오기
        districtName_df=df_list.loc[df_list['districtName'].str.contains(keyword),:]
        
        for yearmonth in yearmonths:
            for i, r in districtName_df.iterrows():
                districtCode = r['districtCode']
                districtName = r['districtName']

                result=gettraveller_bymonth(appkey,districtCode,districtName,yearmonth)

                result_all = pd.concat([result_all,result])
            
    return result_all


위의 함수들을 이용해서 실제 데이터를 불러와 결과를 확인해보겠습니다.
검색할 여행지는 '제주', '속초' 두가지 이고 기간은 202205~202209까지 총 5개월입니다.
2022년 9월이외에는 속초의 검색수가 많은것을 확인가능합니다.

keyword1='속초'
keyword2='제주'
startDate='2022-05-01'
endDate='2022-09-30'
device='mo'  #'pc','mo'

trend_fin=getcountbymonth(keyword1,keyword2,startDate,endDate,device)

#그래프 작성
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()


다음은 '제주','속초'에 대한 여행자수를 확인합니다.
skappkey는 본인의 데이터 입력이 필요합니다.

appkey='YOUR_APPKEY'
#제주를 검색어로.
keywords=[keyword1,keyword2]
yearmonths=['202205','202206','202207','202208','202209']
travel_df=gettraveller(appkey,keywords,yearmonths)
travel_df



그래프로도 확인해보면 아래와 같습니다.

titles=travel_df['districtName'].unique() 
plt.figure(figsize=(6,2))
for title in titles:
    data=travel_df.loc[(travel_df['districtName']==title) ,:]
    plt.plot(data.index,data['travelerCount'],label=title)
    plt.xticks(rotation=90)
    plt.legend()

plt.title('여행자수')
plt.show()


8월이 휴가철이라 여행자수가 많은것을 알수 있습니다.
제주도의 경우 월별 검색수가 9월에 상승한 것을 알수 있는데,
10월이후 제주도 여행자수를 확인해 보는 것도 재미있지 않을까요.


이상으로 여행지의 월별 검색수와 여행자수의 데이터를 비교해 봤습니다.

반응형