이것저것 개발하기!/뉴스&자연어

네이버 뉴스 크롤링 합법적으로 하기! - OPEN API 사용

바람이휑 2021. 1. 30. 16:50
반응형

개발자라면 한번쯤은 해보았을 법한 크롤링!

처음에는 URL과 쿼리를 붙여넣고, 조금 더 능숙해지면 헤더를 붙여넣는 방식으로 개발자라면 거쳐가는 코스 중 하나이다.

 

불법이냐 합법이냐고 많은 논란이 있기도 했고, 지금도 있고.. 비상업적이라면 괜찮다고는 들었지만 무엇인가 찜찜한 마음이 들기 마련이다.

그래서 합법적으로 크롤링할 수 있는 API를 사용해보고자 한다. 일단 이런게 있구나 알아두면 언젠가는 쓸모있을지도 모르겠다.

 

 API를 쉽게 간단하게 말하면, 우리[네이버, 카카오, 구글 등]가 너희[사용자] 쓰기 좋으라고 편하게 만들어놨어! 우리가 하라는 대로 쓰면 돼! 라는 것이다.

 네이버든 카카오든 API를 제공하여 각자가 서비스하는 기능들을 쓸 수 있게 해준다.(물론, 상용버전보다 기능이 제한된 것이 좀 있다.) 우리는 이것으로 사업을 하기도 하고, 본인이 필요한 데이터를 얻는 데 쓰기도 하고, 놀기도 하고? 하면 된다.

 

 

1) 네이버 뉴스 API 신청

 네이버에서 뉴스를 검색하면 나오는 결과를 받을 수 있는 API이다. 무언가 누르고 싶게 생긴 것이 있다.

로그인을 하고 오픈 API 이용 신청을 하면 된다.

링크 : developers.naver.com/docs/search/news/

 

검색 API 뉴스 검색 개발가이드

NAVER Developers - 검색 API 뉴스 검색 개발가이드

developers.naver.com

네이버 OPEN-API

 

반응형

 

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 뉴스 검색 개발가이드

NAVER Developers - 검색 API 뉴스 검색 개발가이드

developers.naver.com

  가장 간단하고 쉬운 파이썬으로 해보려고 한다! 아래 파이썬 코드는 네이버 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개 검색결과)

 

반응형