본문 바로가기

API

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

반응형

네이버 API를 이용해서 검색 키워드의 기간별 등록 현황을 구하고,

최신 블로그의 기간별 등록 현황을 구해 순위에 들어갈 비율을 추정해보겠습니다.

 

1. 네이버 API에서 블로그 데이터를 가져올 환경 확인(Skip가능)

2. 키워드의 연도별, 월별 등록 현황 확인

3. 키워드의 최신순 등록 현황 확인

4. 최신 등록된 블로그중 순위안의 비율 확인

 

1. 네이버 API에서 블로그 데이터를 가져올 환경 확인(Skip가능)

https://yenpa.tistory.com/3

 

[네이버 개발자센터 API] 검색 블로그 데이터 가져오기(파이썬)

파이썬으로 네이버 개발자센터 API의 검색 > 블로그 데이터를 가져오는 방법을 알아보겠습니다. 1. 네이버 개발자센터 API이용신청 2. client_id, client_secret 확인 3. 예제 코드 실행 및 결과확인 4. 예

yenpa.tistory.com

 

2. 키워드의 연도별, 월별 등록 현황 확인

필요한 라이브러리를 import합니다.

import os
import sys
import urllib.request
import json
import pandas as pd
import matplotlib.pyplot as plt

 

네이버 API에서 블로그 데이터를 가져오는 함수를 작성합니다.

결과중 response_json['item']만 DataFrame으로 만들었습니다.

def getresult(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'])

 

query='롯데월드 야경' 이라는 키워드, sort='sim' 정확도 순으로 설정했습니다.

for i in range(0, 2):  블로그 데이터 200개를 수집합니다.

client_id = "YOUR_CLIENT_ID"
client_secret = "YOUR_CLIENT_SECRET"
query = '롯데월드 야경'
display=100
start=1
sort='sim'

result_all=pd.DataFrame()
for i in range(0,2):
    start= 1 + 100*i
    result_blog= getresult(client_id,client_secret,query,display,start,sort)

 

result_blog에 4개의 column을 생성합니다.

   'date' : 'postdate'가 YYYYmmdd 형식을 Datetime 형식으로 변경

   'date_year' : 연도

   'date_month' : 월

   'date_ym' : 년월, YYYYmm 형식

result_blog['date']=pd.to_datetime(result_blog['postdate'], format='%Y%m%d')
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]

데이터를 년도별로 집계합니다.(2022년도에 등록된 블로그의 비율이 높네요)

result_year=result_blog['date_year'].value_counts().sort_index(ascending=False)
plt.figure(figsize=(8,3))
plt.bar(result_year.index, result_year.values)
plt.xticks(rotation=90)
plt.title('year')
plt.show()

데이터를 년월로 집계합니다.

result_blog[['date_ym']].value_counts().sort_index(ascending=False)

 

3. 키워드의 최신순 등록 현황 확인

sort 만 'date'로 변경합니다.

sort='date'
result_all=pd.DataFrame()
for i in range(0,2):
    start= 1 + 100*i
    result_date= getresult(client_id,client_secret,query,display,start,sort)

 

200개의 블로그 결과중 현재날짜기준 -30일까지의 데이터만 수집합니다.

from datetime import datetime, timedelta
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'] > (datetime.now() + timedelta(days=-30)), :]

200 개의 블로그가 작성되는 시간이 2일정도 걸리네요.

실행날짜에 따라 결과는 달라질수 있습니다.

(인기 키워드는 1일, 빈도수가 적은것은 기간이 길어지겠죠)

recent_blog=(result_30days['date'].max()-result_30days['date'].min()).days+1
recent_cnt=200/recent_blog
print('블로그 200개 등록된 기간은 ', str(recent_blog), '일 입니다.')
print('1일에 등록된 블로그 수는 ', str(recent_cnt), '개 입니다.')

 

4. 최신 등록된 블로그중 순위안의 비율 확인

200위 순위안에 현재날짜 -300일까지 날짜의 블로그 수는 26개이고

1일평균 0.087개 정도 등록이 됐습니다.

result_blog=result_blog.loc[result_blog['date'] > (datetime.now() + timedelta(days=-300)), :]
blog_cnt=result_blog.shape[0]
print('300일간 순위 200위안에 등록된 블로그는 ', str(blog_cnt), '개 입니다')
print('최근 1일에 등록된 블로그 중 순위에 들어갈 비율은 "',str((blog_cnt/300)/recent_cnt*100), '%" 입니다.')

3번에서 최근 1일 등록된 블로그수가 200개 이므로 계산하면,

1일에 등록된 블로그 중에 순위에 들어가는 블로그 수는 0.29개 정도됩니다.

print('최근 1일에 등록된 블로그 중 순위에 들어갈 비율은 "',str((blog_cnt/300)/recent_cnt*100), '%" 입니다.')

 

 

다른 키워드인 query = '롯데월드 호수 야경'로 계산한 결과입니다.

롯데월드 야경 보다는 비율이 높아 보이긴 합니다.

 

순위의 블로그의 날짜를 이용 1일 평균 개수를 구했고,

최신순으로 등록된 블로그의 날짜를 이용 1일 평균 개수를 구해

두개의 비율을 구해봤습니다.

절대적인 기준은 아니니 참고용으로 봐주시기 바랍니다.

 

 

전체코드 남겨드립니다.

client_id 및 client_secret은 본인의 데이터의 입력이 필요합니다.

import os
import sys
import urllib.request
import json
import pandas as pd
import matplotlib.pyplot as plt

def getresult(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'])

client_id = "YOUR_CLIENT_ID"
client_secret = "YOUR_CLIENT_SECRET"
query = '롯데월드 야경'
display=100
start=1
sort='sim'

# 정확도순 등록 데이터 확인
result_all=pd.DataFrame()
for i in range(0,2):
    start= 1 + 100*i
    result_blog= getresult(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_year=result_blog['date_year'].value_counts().sort_index(ascending=False)
plt.figure(figsize=(8,3))
plt.bar(result_year.index, result_year.values)
plt.xticks(rotation=90)
plt.title('year')
plt.show()

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)
plt.xticks(rotation=90)
plt.title('year_month')
plt.show()

# 최신순 등록 데이터 확인
sort='date'
result_all=pd.DataFrame()
for i in range(0,2):
    start= 1 + 100*i
    result_date= getresult(client_id,client_secret,query,display,start,sort)
    
from datetime import datetime, timedelta
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=(result_30days['date'].max()-result_30days['date'].min()).days
recent_cnt=200/recent_blog
print('블로그 200개 등록된 기간은 ', str(recent_blog), '일 입니다.')
print('1일에 등록된 블로그 수는 ', str(recent_cnt), '개 입니다.')


result_blog=result_blog.loc[result_blog['date'] > (datetime.now() + timedelta(days=-300)), :]
blog_cnt=result_blog.shape[0]
print('키워드 "' + query + '"에 대한 ')
print('300일간 순위 200위안에 등록된 블로그는 ', str(blog_cnt), '개 입니다')
print('1일 평균 블로그 수는 ', str(blog_cnt/300), '개 입니다')

print('최근 1일에 등록된 블로그 중 순위에 들어갈 비율은 "',str((blog_cnt/300)/recent_cnt*100), '%" 입니다.')
반응형