개발자라면 한번쯤은 해보았을 법한 크롤링!
처음에는 URL과 쿼리를 붙여넣고, 조금 더 능숙해지면 헤더를 붙여넣는 방식으로 개발자라면 거쳐가는 코스 중 하나이다.
불법이냐 합법이냐고 많은 논란이 있기도 했고, 지금도 있고.. 비상업적이라면 괜찮다고는 들었지만 무엇인가 찜찜한 마음이 들기 마련이다.
그래서 합법적으로 크롤링할 수 있는 API를 사용해보고자 한다. 일단 이런게 있구나 알아두면 언젠가는 쓸모있을지도 모르겠다.
API를 쉽게 간단하게 말하면, 우리[네이버, 카카오, 구글 등]가 너희[사용자] 쓰기 좋으라고 편하게 만들어놨어! 우리가 하라는 대로 쓰면 돼! 라는 것이다.
네이버든 카카오든 API를 제공하여 각자가 서비스하는 기능들을 쓸 수 있게 해준다.(물론, 상용버전보다 기능이 제한된 것이 좀 있다.) 우리는 이것으로 사업을 하기도 하고, 본인이 필요한 데이터를 얻는 데 쓰기도 하고, 놀기도 하고? 하면 된다.
1) 네이버 뉴스 API 신청
네이버에서 뉴스를 검색하면 나오는 결과를 받을 수 있는 API이다. 무언가 누르고 싶게 생긴 것이 있다.
로그인을 하고 오픈 API 이용 신청을 하면 된다.
링크 : developers.naver.com/docs/search/news/
2) 등록폼 작성
검색-뉴스 API를 사용하기 위해 등록폼을 작성한다. 애플리케이션 이름은 원하는 것을 하면 된다.
비로그인 오픈 API 서비스 환경은 임의로 넣어주었다.
(지도나 로그인 이 외 다른 API는 임의의 URL에서도 동작을 하는 것으로 보인다. 당장 상용화할 게 아니라면 임의로 넣어주자!)
참고로 본인의 웹사이트를 구축하는 연습을 하고 싶으면,
[2021/01/16 - [WEB :: step by step] - django로 웹사이트 개발하기 튜토리얼 예제- 1탄] 을 참고하여 URL을 넣어도 된다.
3) 등록완료!
등록을 완료하면 다음과 창이 뜬다. 여기서 볼 것은 3가지이다.
Client ID와 Client Secret은 네이버 API로 무언가를 요청할 때, 필요한 Key이다.
- 저 Key는 내가 네이버에 OPEN-APi를 신청했고, 합법적으로 요청하는 거야~ 라고 알려주는 것이다. 고로 Client ID와 Client Secret는 소중히 보관하자
API 호출 안내는 하루에 저만큼만 쓸 수 있어~라는 것이다. 엄빠 카드는 받았지만, 한도가 있다고 생각하면 된다.
4) 이제 뉴스 API를 사용해보자
신청 링크에 다시 들어가보면, 아래에 설명서?같은 것이 있다. 이렇게 쓰는 거야~ 하고 알려주는 거다.
친절한 것은 파이썬, 자바, 자바스크립트 기타 등등 대표 언어로 사용하는 방법을 알려주기도 하지만, 네이버 뉴스 APi는 그런 것까지는 없는 것 같다.(사실 사용하기 너무 쉬워서 없는 게 맞을 것이다.)
링크 : developers.naver.com/docs/search/news/
가장 간단하고 쉬운 파이썬으로 해보려고 한다! 아래 파이썬 코드는 네이버 API를 사용하여 뉴스정보를 가져오는 간단한 코드이다.
아래 코드를 실행하기 앞서 먼저 3)에서 얻은 본인의 Client ID와 Client Key를 $[NAVER CLIENT ID]와 $[NAVER CLIENT KEY]에 넣어준다. 그 후 검색어와 함께 실행시켜주면 된다.
news.py
news.py [검색어]
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 본 파일과 동일한 경로에 result 폴더를 생성해두어야 한다.
import requests
import sys
clientID = $[NAVER CLIENT ID]
clientKey = $[NAVER CLIENT KEY]
def jsonToFile(data):
data = data['items']
with open("./result/news.tsv", "a+") as fw:
for row in data:
line = ""
for i in row:
line = line + str(row[i]) + "\t"
line = line[:-1]
fw.write(line)
fw.write("\n")
def getNews(query, output="json", display=100, start=1, sort="sim"):
display = str(display)
start = str(start)
url = "https://openapi.naver.com/v1/search/"\
"news.{}"\
"?"\
"query={}"\
"&display={}"\
"&start={}"\
"&sort={}".format(output, query, display, start, sort)
headers = {'X-Naver-Client-Id': clientID,
'X-Naver-Client-Secret' : clientKey}
res = requests.get(url, headers=headers)
if (output == 'json'):
data = res.json()
jsonToFile(data)
if __name__ == '__main__':
if len(sys.argv) > 1:
query = sys.argv[1]
getNews(query)
else:
print("Usage : query")
위의 코드에서 보면 알겠지만, Client ID와 Client Key는 헤더에 붙여서 APi를 요청한다. 네이버 API 문서에 자세한 내용은 설명되어있으니, 간단하게 설명하면 다음과 같다.
- Client ID와 Client Key를 헤더에 붙이고, 검색어를 query에 붙인다. (나머지는 기본값이 있으니 무시해도 답은 온다)
- 요청에 따른 응답은 json타입 또는 xml타입으로 받을 수 있으며, 위의 코드에서는 json 타입으로 받았다,.
- 응답에는 검색결과 이외 날짜, rss 등 여러가지를 포함하고 있다. 필요한 것을 받아 쓰면 된다.(jsonToFile 함수에서는 응답의 items에 있는 검색결과만 저장한다.)
- 더 많은 검색 결과를 원하면 start 값을 변경시키면 된다.(100개씩 끊어서 받아온다고 생각하면 된다)
- 사용량은 url 요청 하나당 1개가 오르는 듯하고, 반영시간이 조금 걸리는 듯하다.(한번 요청할 때 많이 요청하자, 최대 100개 검색결과)