네이버 검색어 Trend
파이썬을 통한 자동화 이전에 네이버 데이터랩에서 검색어트랜드를 확인할 수 있다. 이와 동일한 기능을 API로도 재공해주고 있으며, 본 포스팅에서는 직접 트렌드를 조회하는 것이 아닌 파이썬을 통해 자동으로 트렌드를 확인하는 방법을 기술하고자 한다. 필자는 나중에 이 내용을 키워드 추출하는 방법을 함께 활용하고자 한다.
https://datalab.naver.com/keyword/trendSearch.naver
Cloud Search Trend
다른 Naver Map API 처럼 신청하면 사용할 수 있다. 하루 사용량이 1000건으로 제한되어 있으나, 1000건 이상 조회할일은 딱히 없을듯 싶다. 기존에 다른 Application을 사용하고 있던 유저는, 아래 이미지에서 본인이 지정한 Application 이름 아래 '수정'으로 들어가면 새로운 application은 만들 필요 없이 바로 신청이 가능하다.
Parameter
위와 같은 총 9의 파라미터를 설정할 수 있다. 이는 데이터랩에서 재공하는 기능과 동일한 것으로 보인다. 6개의 필수 파라미터가 있는데, 'keywordGroups', 'groupName', 'keywords' 세 개의 파라미터의 설명이 그렇게 직관적으로 이해되지는 않았다.
이에 다시 검색어트렌드를 확인해보니, ' 궁금한 주제어를 설정하고, 하위 주제어에 해당하는 검색어를 콤마(,)로 구분입력해 주세요. 입력한 단어의 추이를 하나로 합산하여 해당 주제가 네이버에서 얼마나 검색되는지 조회할 수 있습니다. 예) 주제어 캠핑 : 캠핑, Camping, 캠핑용품, 겨울캠핑, 캠핑장, 글램핑, 오토캠핑, 캠핑카, 텐트, 캠핑요리' 이런 문구가 있다. '입력한 단어를 하나로 합산' 한다고 하니 'keywords'들의 검색량이 전부 합산되어 'groupName'에 할당된다는 얘기다. json 예시도 있어 형식에 맞춰 param으로 전달하면 될 듯하다.
"keywordGroups": [
{
"groupName": "한글",
"keywords": [
"한글",
"korean"
]
},
{
"groupName": "영어",
"keywords": [
"영어",
"english"
]
}
Python 예제 (1) - 최적화되지 않은 예시
url = "https://naveropenapi.apigw.ntruss.com/datalab/v1/search"
total_trend = []
for i in range(int(np.ceil(len(keyword_json)/5))):
body = {"startDate": (datetime.datetime.now() - datetime.timedelta(days=7)).strftime('%Y-%m-%d'),
"endDate": datetime.datetime.now().strftime('%Y-%m-%d'),
"timeUnit": "date",
"keywordGroups": keyword_json[i*5:(i+1)*5]
}
body=str(body).replace("'",'"')
request = urllib.request.Request(url)
request.add_header("X-NCP-APIGW-API-KEY-ID",client_id)
request.add_header("X-NCP-APIGW-API-KEY",client_secret)
request.add_header("Content-Type","application/json")
response = urllib.request.urlopen(request, data=body.encode("utf-8")).read()
total_trend = total_trend + json.loads(response)['results']
Python의 기본 라이브러리인 urllib으로 구현한 Naver Search Trend 구현 코드다. for 문으로 구현된 이유는 NaverAPI는 최대 5개의 그룹까지만 설정이 가능하기 때문이다.검색하고자 하는 keyword가 5개 이내로 국한될 일을 없기에, 우선 keyword_json이라는 변수로 검색하고 싶은 모든 keywordGroup을 Parameter 섹션에 있는 예시처럼 모아둔다. 이후 모든 group이 순차적으로 확인되도록 api를 실행시킨다. 아래는 이를 통해 얻은 trend 예시다. data 안에 관련 정보가 포함되어 있는 것을 알 수 있다.
최적화되지 않았다는 의미는 아래 시각화에서 설명하고자 한다.
시각화
plt.figure(figsize=(14, 7))
for keyword in total_trend:
print('title : ', keyword['title'], '/ keywords :', keyword['keywords'])
period = []
ratio = []
for x in keyword['data']:
period.append(x['period'])
ratio.append(x['ratio'])
plt.plot(period, ratio, label=keyword['title'])
plt.title('Naver Search Trends Over Time')
plt.xlabel('Date')
plt.ylabel('Interest')
plt.legend(loc='upper left')
plt.show()
API를 통해 얻은 Trend를 시각화한 코드다. 결과는 아래 이미지와 같다. 결과를 보면 검색량에 비례하여 그래프가 잘 그려진 것 같지만 특이한 부분이 하나있다. Y축의 범위를 보면 알 수 있듯이, 절대적인 검색 횟수가 나오는 것이 아닌 상대적인 비율이 나오게된다. 그런데 100% 인 지점이 2군데가 있다. 어떻게 완전히 동일함 검색량이 나올 수 있는 것일까?
그 이유는 최대 그룹수가 5개이기 때문이다. 상대적인 비율이기 때문에, 어느 그룹을 묶느냐에 따라 검색량이 달라지는 것처럼 보이는 착시를 일으킨다. 데이터랩에서 100% 비율을 보인 두 가지 조건을 입력하여 확인해보니 차이가 API로 확인한 그래프와 다른 것을 알 수 있다. 결국 5개 이하의 그룹에서만 유효하고 5개 이상의 그룹에서는 쓸모가 없는 기능이 되어버린다. 그렇기에 api를 많이 실행시키더라도 정확한 정보를 얻는 방식을 다시 구현하였다.
Python 예제 2
url = "https://naveropenapi.apigw.ntruss.com/datalab/v1/search"
max_index = 0
total_trend = []
for i in range(len(keyword_json)):
body = {
"startDate": (datetime.datetime.now() - datetime.timedelta(days=7)).strftime("%Y-%m-%d"),
"endDate": datetime.datetime.now().strftime("%Y-%m-%d"),
"timeUnit": "date",
"keywordGroups": [keyword_json[0], keyword_json[i]]
}
if i == 0 : body["keywordGroups"] = [keyword_json[0]] # 처음은 단일 검색
body=str(body).replace("'",'"')
request = urllib.request.Request(url)
request.add_header("X-NCP-APIGW-API-KEY-ID",client_id)
request.add_header("X-NCP-APIGW-API-KEY",client_secret)
request.add_header("Content-Type","application/json")
response = json.loads(urllib.request.urlopen(request, data=body.encode("utf-8")).read())['results']
if i == 0: # 처음은 바로 추가하고 최대치 index 저장
total_trend = total_trend + response
max_index = np.argmax([peri['ratio'] for peri in response[0]['data']])
else: # 첫 그룹과 상대적인 크기 비교
# 첫 그룹에 100%가 있으면 그대로 추가 가능
if max([peri['ratio'] for peri in response[0]['data']]) == 100:
total_trend = total_trend + response[1:]
# 첫 그룹에 100%가 없으면 비율 조정 후에 추가 필요
else:
max_value = response[0]['data'][max_index]['ratio']
response[1]['data'] = [{'period' : peri['period'], 'ratio' : peri['ratio'] * 100 / max_value} for peri in response[1]['data']]
total_trend = total_trend + response[1:]
5개 이상의 키워드에서도 상대 비율을 구하는 방법이다. 먼저 첫번째 그룹의 trend를 확인한다. 이후 5개씩 묶어서 검색하지 않고, 첫번째 그룹과 확인하지 않은 단일 그룹 2개를 묶어 trend를 확인한다. 이후 첫번째 그룹을 기준점으로 삼아, 전체 그룹의 트렌드를 비교할 수 있다.
물론 2개가 아닌 5개로 묶어 비교가 가능하지만, 2개가 직관적으로 비교하기도 쉽고, 하루 할당량 1000개를 다 채울 일은 없을듯 하여 위처럼 구현했다. 이를 통해 동일한 시각화 기능으로 확인해보면 원하는 형식으로 제대로 확인되었음을 알 수 있다. 또한 비율이기 때문에 경우에 따라 기준점보다 높은 항목이 나오면 100% 초과 되는 지점도 존재한다. 하지만 상대적은 크기만 대충 알면 되기에 굳이 보정하진 않았다. 필요하다면 ('value' - min) / (max - min) 으로 0~1로 조정이 가능하다.
근본적인 문제점
이렇게 시각화까지 전부 구현해보았다. 하지만 Naver Search Trend를 사용할 수 없는 근본적인 문제가 존재한다. 이는 오늘의 검색량은 제공하지 않는다는 것이다. 유저에 따라 원하는 정보가 다르기에 이 점이 크게 불편하지 않은 사람도 있을 수 있느나, 필자는 이로 인해 api를 활용하지 않을 것 같다. 이에 naver와 유사한 정보를 google trend에서도 확인이 가능하다. 다음에는 google trend를 확인하는 방법을 알아보고자 한다.
'Python > 파이썬 자동화' 카테고리의 다른 글
[자동화] 뉴스 헤드라인 키워드 추출 및 동일 카테고리 묶기 (0) | 2024.07.09 |
---|---|
[파이썬 자동화] 법원 경매 결과 정리 (0) | 2024.07.03 |
[파이썬 자동화] 법원 경매 물건 검색 (마무리) (0) | 2024.06.26 |
[파이썬 자동화] 법원 경매 물건 검색 (4) (0) | 2024.06.19 |
[파이썬 자동화] 법원 경매 물건 검색 (3) (2) | 2024.06.12 |