Data Crawling - 네이버 검색 api 사용하여 데이터 수집하기

이번 포스트는 네이버 개발자 센터에서 제공하는 검색 api를 통해 우리가 원하는 키워드를 검색하고, 그 결과를 json파일로 저장하는 것을 다루어보겠다.

json파일로 저장하는 이유는 pandas와 같은 데이터 분석 툴을 사용할 때, import하기 좋은 파일 형식이기 때문이다.

아래와 같은 순서로 진행한다.

  • Step 1: 네이버 개발자센터 등록 및 키 값 받아오기
  • Step 2: api caller 만들기
  • Step 3: 데이터 수집 후 json 파일로 저장하기
  • Step 4: pandas 사용하여 분석하기

네이버 개발자센터 등록하기

먼저 네이버 개발자 센터에 접속하여 Application -> 애플리케이션 등록 을 클릭한다.

아래와 같은 화면이 뜨는데, 검색 api 누르고 안드로이드 설정에서 적당한 이름을 넣으면 된다. (com.블라블라)

완료하게 되면, 애플리케이션 정보에 client ID와 client secret 코드가 보이는데 이걸 어딘가 안전한 곳에 복사해둔다. (노출 절대 금지)

api caller 만들기

이제, 네이버 검색 api를 불러올 caller 을 만들어 보자.

아까 전 네이버 개발자 센터 홈페이지에서 Documents -> 서비스 API -> 검색을 누르면 아래와 같은 페이지가 뜬다. 코드는 python으로 클릭.

여기 있는 코드를 긁어서 오면 아래와 같다. 중간에 YOUR_CLIENT_IDYOUR_CLIENT_SECRET에는 아까 복사해 두었던 키값들을 기입한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 네이버 검색 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)

샘플 코드의 주석에 적힌 대로, 현재 이 코드는 키워드를 받아서 블로그를 검색한 결과를 보여준다.

코드가 너무 기니까 조금 간략하게 바꾸어 보자. 대충 이런 식이다.

1
2
3
4
5
6
7
8
9
10
import requests
from urllib.parse import urlparse

keyword = “”
url = “https://openapi.naver.com/v1/search/blog?query=" + keyword
result = requests.get(urlparse(url).geturl(),
headers={“X-Naver-Client-Id”:“YOUR_CLIENT_ID”,
“X-Naver-Client-Secret”:“YOUR_CLIENT_SECRET”})
json_obj = result.json()
print(json_obj)

위 코드는 keyword 를 받아서 네이버 검색 api를 거친 후 json_obj를 반환한다.

이제 call을 하는 함수를 만들어 보자. 키워드를 입력한 후, 그 검색 결과를 한번에 100개씩 받아오는 함수를 작성한다.

1
2
3
4
5
6
7
8
9
10
11
import requests
from urllib.parse import quote

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

&display=100은 한번에 100개의 검색 결과를 보여준다는 것이고, &start=은 그 뒤의 숫자에 따라 어느 순서의 검색 결과부터 출력하는지를 결정한다.

뒤의 숫자는 그냥 두면 int 속성을 가지게 되므로, str()을 사용하여 string으로 바꾸어 url을 완성시킨다.

데이터 수집 후 저장하기

이제, 검색 결과를 한번에 1000개 수집하여 json 파일로 저장해 보자.

모듈화를 위해 libs 폴더 내 naver_api_call 폴더를 만들고, 그 내부에 먼저 api_caller.py 파일을 만들어 작성하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# api_caller.py

import requests
from urllib.parse import quote

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

# 1000개의 검색 결과 받아오기
def get1000results(keyword):
list = []
for num in range(0,10):
list = list + call(keyword, num * 100 + 1)[‘items’] # list 안에 키값이 ’item’인 애들만 넣기
return list

함수들을 만들었으니, 이제 실제로 사용해 보자. 우리가 할 일은 네이버 api call을 하고, 1000개의 키워드 검색 결과를 받아온 후, 이를 json파일에 저장하는 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
# 01_collect.py

from libs.naver_api_call.api_caller import get1000results
import json

list = []
result = get1000results(“강남역 맛집”)
result_2 = get1000results(“강남역 찻집”)
list = list + result + result_2

file = open(“./gangnam.json”, “w+”) # gangnam.json 파일을 쓰기 가능한 상태로 열기 (만들기)
file.write(json.dumps(list)) # 쓰기

위 코드를 출력하면 정상적으로 gangnam.json이 디렉토리에 생성됨을 확인할 수 있다.

pandas 사용하여 분석하기

pandas는 여러가지 분석에 유용한 함수들을 제공하여, 길고 긴 json 파일을 보다 쉽고 빠르게 파악할 수 있도록 돕는다.

1
2
3
4
5
6
7
8
9
10
11
12
# 02_analyze_pd.py

import pandas as pd

df = pd.read_json(“./gangnam.json”)
print(df.count()) # 각 key 별 숫자 출력

df_sum = df.groupby(“bloggername”).count() # groupby() 함수를 사용하여 bloggername별로 출력
print(df_sum)

bloggernames = df[‘bloggername’] # bloggername 만 출력
print(bloggernames)

count() 는 json 파일에 저장된 각각의 key값에 대한 데이터 숫자를 세어준다. 우리는 위에서 “강남역 맛집”으로 검색한 결과 1000개, 그리고 “강남역 찻집”으로 검색한 결과 1000개로 총 2000개의 결과값을 저장해 두었었다.

groupby() 는 지정한 key값으로 결과값을 그룹화하여 보여준다. 결과값을 보면 어떤 bloggername을 가진 사람이 우리가 지정한 키워드에 대해서 블로깅을 많이 하였는지 알 수 있다.

세 번째 출력값은 현재 저장된 json 파일에서 bloggername 을 전부 출력해 본 것이다. 총 1640개의 블로그가 수집되었음을 알 수 있다.

위 포스트는 Kyeongrok Kim님의 네이버 api 불러오기 예시를 실습해보고, 이를 간단히 정리한 것임을 밝힙니다.