본문 바로가기

API

[네이버 API] 블로그 나만의 키워드 마스터 만들기 두번째(파이썬)

반응형

지난번 포스팅의 

나만의 키워드 마스터에서 키워드의 연도별 월별 블로그 등록 현황과 해당 키워드의 블로그가 200위내 들어갈 비율에 대해 구해봤습니다.이번에는 지난번 내용에 월별 실 검색수를 더해보도록 하겠습니다.

 

1. 블로그 나만의 키워드 마스터 만들기1 (Skip가능)

2. 네이버 검색광고 API로 연관검색어 결과 가져오기

3. 키워드로 블로그 순위에 들어갈 비율을 추정

4. 월별 실 검색수 가져오기

5. 결과 종합

 

1. 블로그 나만의 키워드 마스터 만들기1 (Skip가능)

https://yenpa.tistory.com/20

 

[네이버 API] 블로그 나만의 키워드 마스터 만들기(파이썬)

네이버 API와 네이버 광고 API를 이용해서 블로그 등록시 참고할 나만의 키워드 마스터를 만들어보겠습니다. 키워드에 대한 블로그의 200위내 들어갈 비율과 연관 검색어들의 검색 정보들을 확인

yenpa.tistory.com

 

2. 네이버 검색광고 API로 연관검색어 결과 가져오기

키워드의 월간 검색수, 월평균 클릭수, 연관 검색어등의 정보가 있는 데이터를 가져오는 코드입니다.

코드 중간의 API_KEY, SECRET_KEY, CUSTOMER_ID는 본인의 데이터가 필요합니다.

# 네이버 광고 API 연관키워드 수집
import os
import sys
import urllib.request
import json
import pandas as pd
import matplotlib.pyplot as plt
import time
import random
import requests
plt.rc('font', family='NanumGothic') 


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(hintKeywords):

    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']=hintKeywords
    params['showDetail']='1'

    r=requests.get(BASE_URL + uri, params=params, 
                 headers=get_header(method, uri, API_KEY, SECRET_KEY, CUSTOMER_ID))
    
    result=pd.DataFrame(r.json()['keywordList'])
    result.columns=['연관키워드','월간검색수(PC)','월간검색수(모바일)',
                    '월평균클릭수(PC)','월평균클릭수(모바일)','월평균클릭률(PC)',
                   '월평균클릭률(모바일)','월평균노출광고수','경쟁정도']

    return result

class signature 및 get_header는 header정보를 추가하기 위한 부분으로 그대로 사용하시면 되겠습니다.

def getrelkeyword(hintKeywords): 의 부분이 실제 이용하는 함수이고 

API 결과에서 실제 데이터는 'keywordlist' 에 있어 이부분만 따로 저장했습니다.

그리고 column명을 알기쉬운 단어로 변경했습니다.

def getrelkeyword(hintKeywords):
    ...중략...    
    
    r=requests.get(BASE_URL + uri, params=params, 
                 headers=get_header(method, uri, API_KEY, SECRET_KEY, CUSTOMER_ID))
    
    result=pd.DataFrame(r.json()['keywordList'])
    result.columns=['연관키워드','월간검색수(PC)','월간검색수(모바일)',
                    '월평균클릭수(PC)','월평균클릭수(모바일)','월평균클릭률(PC)',
                   '월평균클릭률(모바일)','월평균노출광고수','경쟁정도']

keyword  화담숲으로 결과를 확인해볼까요

keyword='화담숲'

hintKeywords=[keyword.replace(' ','')]
resultdf = getrelkeyword(hintKeywords)
resultdf

월간 검색수, 클릭수, 클릭률등이 보이고 연관키워드가 확인이 됩니다.

단풍시즌이라 월간 검색수가 다른 것보다 훨씬 높은것 같네요.

 

3. 키워드로 블로그 순위에 들어갈 비율을 추정

검색 키워드가 블로그 200위에 들어갈 비율을 확인하겠습니다.

간략하게 설명하면 200위 안의 블로그 대상으로 하루에 평균 몇 개정도 등록이 되었는지 계산하고,

최근 며칠 평균 몇 개의 블로그가 등록 되었는지 계산해서 비율을 추정합니다.

관심있으신분은 아래 포스팅 확인하셔도 됩니다.

https://yenpa.tistory.com/8

 

[네이버 개발자센터 API] 키워드로 블로그 순위에 들어갈 비율을 추정

네이버 API를 이용해서 검색 키워드의 기간별 등록 현황을 구하고, 최신 블로그의 기간별 등록 현황을 구해 순위에 들어갈 비율을 추정해보겠습니다. 1. 네이버 API에서 블로그 데이터를 가져올

yenpa.tistory.com

전체 코드남겨드립니다.

# 검색어의 블로그 순위에 들어갈 비율
import os
import sys
import urllib.request
import json
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime, timedelta

def getapiresult(client_id,client_secret,query,display=10,start=1,sort='sim'):
    encText = urllib.parse.quote(query)
    url = "https://openapi.naver.com/v1/search/blog?query=" + encText + \
    "&display=" + str(display) + "&start=" + str(start) + "&sort=" + sort

    request = urllib.request.Request(url)
    request.add_header("X-Naver-Client-Id",client_id)
    request.add_header("X-Naver-Client-Secret",client_secret)
    response = urllib.request.urlopen(request)
    rescode = response.getcode()
    if(rescode==200):
        response_body = response.read()
        response_json = json.loads(response_body)
    else:
        print("Error Code:" + rescode)

    return pd.DataFrame(response_json['items'])


def getblogcnt(keyword):
    #client_id = "YOUR_CLIENT_ID"
    #client_secret = "YOUR_CLIENT_SECRET"
    query = keyword
    display=100
    start=1
    sort='sim'

    # 정확도순 등록 데이터 확인
    result_all=pd.DataFrame()
    for i in range(0,2):
        start= 1 + 100*i
        result_blog= getapiresult(client_id,client_secret,query,display,start,sort)

    result_blog['date']=pd.to_datetime(result_blog['postdate'], format='%Y%m%d') #post
    result_blog['date_year']=result_blog['postdate'].str[:4]
    result_blog['date_month']=result_blog['postdate'].str[4:6]
    result_blog['date_ym']=result_blog['postdate'].str[:6]

    result_ym=result_blog['date_ym'].value_counts().sort_index(ascending=False)
    plt.figure(figsize=(8,3))
    #plt.bar(result_ym.index, result_ym.values)
    sns.barplot( x=result_ym.index, y=result_ym.values)
    plt.xticks(rotation=90)
    plt.title('월별 등록수(' + keyword + ')')
    plt.show()

    # 최신순 등록 데이터 확인
    sort='date'
    result_all=pd.DataFrame()
    for i in range(0,2):
        start= 1 + 100*i
        result_date= getapiresult(client_id,client_secret,query,display,start,sort)


    result_date['date']=pd.to_datetime(result_date['postdate'], format='%Y%m%d')
    result_date['date_year']=result_date['postdate'].str[:4]
    result_date['date_ym']=result_date['postdate'].str[:6]
    result_30days=result_date.loc[result_date['date'] > (result_date['date'] + timedelta(days=-30)), :]

    recent_blog_days=(result_30days['date'].max()-result_30days['date'].min()).days+1
    recent_cnt=200/recent_blog_days
    
    result_blog_days=result_blog.loc[result_blog['date'] > (datetime.now() + timedelta(days=-300)), :]
    blog_cnt=result_blog_days.shape[0]
    
    returnvalue={}
    returnvalue['recent_blog_days']=str(recent_blog_days)
    returnvalue['recent_cnt']=str(recent_cnt)
    returnvalue['blog_cnt']=str(blog_cnt)
    returnvalue['blog_cnt_300days']=str(blog_cnt/300)
    returnvalue['ratio']=str((blog_cnt/300)/recent_cnt*100)
    
    return returnvalue

결과는 월별 등록수 및 아래의 계산 결과가 되겠습니다.

result_month=getblogcnt(keyword)
result_month

 

 

4. 월별 실 검색수 가져오기

키워드의 월별로 실제 검색수를 확인해 보겠습니다.

 

검색트렌드에서는 키워드의 월별 상대 비율에 대한 정보만 제공합니다.

월별로 가장 많은 달이 100%가 되고 나머지는 100%에 대한 상대 비율이 되겠습니다.

2번에서는 1달의 키워드의 실제 검색수를 구할수가 있습니다.

이 데이터를 이용해서 월별의 비율을 절대치로 계산하는 방식이 되겠습니다.

 

키워드의 월별 상대 검색수를 구하겠습니다.

#통합검색어 트렌드 확인
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,startDate,endDate):
    client_id = "YOUR_CLIENT_ID"
    client_secret = "YOUR_CLIENT_SECRET"
    
    timeUnit='month' 
    keywordGroups=[
        {'groupName':keyword1, 'keywords':[keyword1]},
    ]

    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) ,:]
        sns.barplot(data=data, x='period', y='ratio',label=title)
        plt.xticks(rotation=90)
        

    plt.title('월별트렌드' )
    plt.show()
    
    return response_results_all

2022년 1월~ 10월까지의 키워드 화담숲에 대한 Mobile에서의 검색 결과입니다.

결과를 보시면 10월달 단풍시즌에 검색량이 많은 것을 알수 있습니다.

10월달 100%기준으로 나머지는 상대비율이 표시가 됩니다.

startDate='2022-01-01'
endDate='2022-10-11'
device='mo'  #'pc','mo'

trend=gettrenddata(keyword,startDate,endDate)
relkeyword=getrelkeyword(keyword)

 

4. 월별 실 검색수 가져오기

 

2번에서 구한 dataframe입니다. 이 데이터를 이용해서 위의 상대비율 -> 절대검색수로 변환하겠습니다.

 

상대 비율을 -> 절대 검색수로 변환하는 코드입니다.

#keyword에 대한 월간 실 검색수 저장

def get_searchcount(trend,relkeyword,keyword):
    keyword_percent=trend.loc[trend['title']==keyword,'ratio'].iloc[-1]

    if device=='pc':
        colnum=1
    elif device=='mo':
        colnum=2

    #keyword에 대한 pc/mo 의 월간검색수 저장
    keyword_count=relkeyword.iloc[0,colnum]

    keyword_1percent=keyword_count/keyword_percent

    #통합 트렌드 데이터의 "ratio(%)"와 keyword별 "검색수/1%"의 곱으로 월별 검색수를 계산
    trend_fin=trend.copy()
    trend_fin.loc[trend_fin['title']==keyword,(device+'검색수')]= \
      keyword_1percent*trend_fin.loc[trend_fin['title']==keyword,'ratio']

    trend_fin=trend_fin.astype({(device+'검색수'):'int64'})
    
    plt.figure(figsize=(8,3))
    sns.barplot(data=trend_fin, x='period', y=(device+'검색수'))
    
    plt.xticks(rotation=90)
    plt.title('월별 ' + device + '검색수')
    plt.gca().yaxis.set_major_formatter(StrMethodFormatter('{x:,.0f}'))
    return trend_fin

#get_searchcount(trend,keyword)

 

5. 결과 종합

위 결과들을 한번에 볼수 있는 함수를 작성 후,

키워드 화담숲에 대한 결과를 확인해 보겠습니다.

# keyword를 입력 받아 결과를 출력하는 함수
from IPython.display import display

def exeresults(keyword):
    result=getblogcnt(keyword)

    print('키워드 : ' + keyword)
    print('블로그 200개 등록된 기간 : ' + result['recent_blog_days'] + '일')
    print('최근 1일에 등록된 블로그 수 : ' + result['recent_cnt'] + '개')
    
    print('300일간 순위 200위안에 등록된 블로그 : ', result['blog_cnt'] + '개')    
    print('200위내 1일 평균 등록 블로그 수 : ', result['blog_cnt_300days'] + '개')

    print('최근 1일에 등록된 블로그 중 200위내에 들어갈 비율은 "',result['ratio'], '%" 입니다.')

    hintKeywords=[keyword.replace(' ','')]
    resultdf = getrelkeyword(hintKeywords)

    print('연관 키워드의 검색정보')
    display(resultdf.head(6))
    
    startDate='2022-01-01'
    endDate=datetime.now().strftime('%Y-%m-%d')
    device='mo'  #'pc','mo'

    trend=gettrenddata(keyword,startDate,endDate)
    display(trend)
    get_searchcount(trend,resultdf,keyword)
keyword='화담숲'
exeresults(keyword)

 

 

 

다른 키워드인 인천공항 주차장으로 검색해볼까요

keyword='인천공항 주차장'
exeresults(keyword)

2022년도 블로그가 가장 많고 2019년이 다음으로 많습니다.

월별은 2022년 9월 10월이 많이 나타나네요

월별 Mobile에서의 실제 검색수 입니다.

이상으로 나만의 키워드 마스터만들기 두번째를 마치겠습니다.

 

반응형