네이버 블로그의 특정 키워드 크롤링하기

John
5 min readMay 14, 2020

네이버 블로그에서 특정 키워드를 검색하면 나오는 다양한 글들이 있다. 이 글들을 수집하고 싶을 때 네이버에서 제공하는 검색 api를 활용하는 방법을 공유하고자 한다.

1. 네이버 개발자 센터에서 애플리케이션 등록

상기 url에 들어가서 애플리케이션을 등록을 하면, Application 목록에서 client Id와 client secret을 확인할 수 있다.

2. 검색 API 호출

예제는 너무 잘되있었고, 우리는 응용만 하면 된다 (갓..네이버)

  • 예제 코드
# 네이버 검색 API예제는 블로그를 비롯 전문자료까지 호출방법이 동일하므로 blog검색만 대표로 예제를 올렸습니다.
# 네이버 검색 Open API 예제 - 블로그 검색
import os
import sys
import urllib.request
client_id = "YOUR_CLIENT_ID"
client_secret = "YOUR_CLIENT_SECRET"
encText = urllib.parse.quote("검색할 단어")
url = "https://openapi.naver.com/v1/search/blog?query=" + encText # json 결과
# url = "https://openapi.naver.com/v1/search/blog.xml?query=" + encText # xml 결과
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()
print(response_body.decode('utf-8'))
else:
print("Error Code:" + rescode)
파라미터는 각자 조정하시면 될 듯합니다.
  • 응용 코드 함수
import requests
from urllib.parse import quote

def call(keyword, start):
encText = quote(keyword)
url = "https://openapi.naver.com/v1/search/blog?query="+encText+"&sort=sim&display=100&start="+str(start)
result = requests.get(url=url, headers={"X-Naver-Client-Id":"ID","X-Naver-Client-Secret":"Secret"})
print(result) # Response [200]
return result.json()

def results(keyword):
list = []
for num in range(0,10):
list = list + call(keyword, num * 110 + 1)['items']
return list
  • 함수 호출
import jsonlistt = []
result = result('남성코트')
listt = listt+result
file = open('coat.json','w+')
file.write(json.dumps(listt))
import pandas as pddf = pd.read_json('coat.json')
df.to_csv('crawling_naver_coat.csv',encoding='utf-8-sig',index=False)

끝이다. 여기서 encoding에 ‘utf-8-sig’는 mac 환경에서 한글깨짐이 발생할 때 해당 코드를 입력하면 거의 무적권.. 한글이 안 깨지게 할 수 있다.

여기서 한계점은 api를 통한 호출을 할 경우 1000건 밖에 호출이 안된다는 점이 있으니, 더 필요한 경우에는 api 제휴를 신청하면 좋을 듯 하다.

3. 결과 확인

재밌게도.. html 태그가 생생하게 남아있어서 조금의 전처리는 필요할 것 같다.

참고

--

--