지난번 포스팅의
나만의 키워드 마스터에서 키워드의 연도별 월별 블로그 등록 현황과 해당 키워드의 블로그가 200위내 들어갈 비율에 대해 구해봤습니다.이번에는 지난번 내용에 월별 실 검색수를 더해보도록 하겠습니다.
1. 블로그 나만의 키워드 마스터 만들기1 (Skip가능)
2. 네이버 검색광고 API로 연관검색어 결과 가져오기
3. 키워드로 블로그 순위에 들어갈 비율을 추정
4. 월별 실 검색수 가져오기
5. 결과 종합
1. 블로그 나만의 키워드 마스터 만들기1 (Skip가능)
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위 안의 블로그 대상으로 하루에 평균 몇 개정도 등록이 되었는지 계산하고,
최근 며칠 평균 몇 개의 블로그가 등록 되었는지 계산해서 비율을 추정합니다.
관심있으신분은 아래 포스팅 확인하셔도 됩니다.
전체 코드남겨드립니다.
# 검색어의 블로그 순위에 들어갈 비율
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에서의 실제 검색수 입니다.
이상으로 나만의 키워드 마스터만들기 두번째를 마치겠습니다.
'API' 카테고리의 다른 글
[전자공시 Dart API] 전체 상장 회사의 상세정보(기업개황) 수집 및 저장 (19) | 2022.11.07 |
---|---|
[전자공시 Dart API] 유통주식 비율이 낮은 (자기주식 비율이 높은) 회사 리스트 (4) | 2022.11.06 |
[아파트 실거래가 API] 월간 가격상승 Top 및 거래량 Top확인하기 (4) | 2022.11.03 |
[전자공시 Dart API] 회사분할결정 공시후 주가 확인 (4) | 2022.11.02 |
[전자공시 Dart API] 회사합병결정 공시후 주가 확인 (4) | 2022.10.31 |