KoreanFoodie's Study

네이버 뉴스 API로 뉴스 크롤링하기! (파이썬으로 네이버 오픈 API 뉴스 크롤러 만들기) 본문

Cloud, Web

네이버 뉴스 API로 뉴스 크롤링하기! (파이썬으로 네이버 오픈 API 뉴스 크롤러 만들기)

GoldGiver 2019. 11. 7. 00:28

가끔 자료수집을 하다보면 신문 기사 등의 데이터를 대량으로 수집해야 되는 경우가 생긴다.

파이썬은 워낙 크롤러 만들기 좋게 requests나 BeautifulSoup등의 모듈이 그 기능을 제공해 주지만, 때로는 사이트에서 API를 직접 제공하기도 한다.

네이버의 경우에는 오픈 API(심지어 로그인도 필요 없다!)를 이용해 검색을 통한 자료를 수집할 수 있도록 도와준다.

그럼 이번 포스트에서는 이 오픈 API를 이용해서 내가 검색한 키워드로 수집한 뉴스기사들의 제목과 링크를 저장하는 방법을 알아보록 하겠다.

 


먼저, 네이버 데이터랩으로 가면, 다음과 같은 창이 뜨는데, 저기서 `오픈 API 신청`을 눌러 어플리케이션을 만들어 주자.

어플리케이션은 대충 만들어도 된다.

어플리케이션을 만들면 다음과 같이 "Client ID"와 "Client Secret"을 얻게 되는데, 이 값들만 잘 저장해 놓으면 된다.

 


 

이제 구현한 코드를 보자.

import os
import sys
import urllib.request
from urllib.parse import *
import requests
from bs4 import BeautifulSoup
import json
import re

# 오픈 API 아이디, 비번 (최초 설정 후 건드리지 말 것)
client_id = "xxxxxxxxxxxx"
client_secret = "xxxxxxxxxxxx"

# keyword_1 : 첫번째 키워드
# keyword_2 : 두번째 키워드
# keyword_3 : 세번째 키워드
# 첫번째 키워드 + 두번째 키워드로 검색이 진행됩니다.
# 예를 들어, 첫번째 키워드가 ['개', '고양이', '토끼'] 이고
# 두번째 키워드가 ['1', '2'] 이면,
# 개 1, 개 2, 고양이 1, 고양이 2, 토끼 1, 토끼 2 처럼
# 키워드 1 개수 * 키워드 2 개수 만큼 검색 쿼리가 생성됩니다.
# 세번째 키워드는, 추가적으로 단일 키워드를 검색하고 싶은 경우 활용합니다.

keyword_1 = ['강아지', '고양이']
keyword_2 = ['토끼', '공원']


display = 30 # 각 키워드 당 검색해서 저장할 기사 수



#
#
# 여기서부터는 코드입니다 (신경 안쓰셔도 됩니다!)
#
#


# Input(str) : 뉴스에 검색할 단어 넣기
def news_search(min_name):
    encText = urllib.parse.quote(min_name)
    url = "https://openapi.naver.com/v1/search/news.json?query=" + encText + \
        "&display=" + str(display) + "&sort=sim"
         # json 결과
    # url = "https://openapi.naver.com/v1/search/news.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_str = response.read().decode('utf-8')
        response_body_str = response.read().decode('utf-8')
        json_acceptable_string = response_body_str.replace("'", "\"")
        response_body = json.loads(response_body_str)
        title_link = {}
        for i in range(0, len(response_body['items'])):
            title_link[response_body['items'][i]['title']] = \
                response_body['items'][i]['link']
        return title_link

    else:
        print("Error Code:" + rescode)


# extract urls from correspoding response_body
def get_url(resbody):
    title_link = {}
    #print(str(len(resbody['items'])) + ' length of resbody of items')
    for i in range(0, len(resbody['items'])):
        #print(resbody['items'][i]['title'])
        title_link[resbody['items'][i]['title']] = resbody['items'][i]['link']
    return title_link


# using url list, crawl html and store them as .html
def url_to_html(title_links, cur_keyword1):
    # using url, store them into .html
    # 1. Make a single html file and add links to it
    filename = re.sub("[\/:*?\"<>|]", "", cur_keyword1)
    f = open(filename + '.html', 'w', encoding='UTF-8')
    for k in title_links.keys():
        '''
        # 2. Make seperate folder for each keyword combiantion
        filename = re.sub("[\/:*?\"<>|]", "", k)
        path = os.path.abspath(".\\" + cur_keyword1)
        f = open(os.path.join(path, filename) +'.html', 'w', encoding='UTF-8')
        '''
        f.write("<A href=" + \
            title_links[k] + ">" + \
                k + "</A>" + "<br></br>")

# 키워드 1 + 키워드 2 조합으로 검색
def keyword_combined(keyword_1, keyword_2):
    for i in range(len(keyword_1)):
        '''
        # Make folders for each articles
        # Uncomment it when you use "2" in url_to_html function
        if not os.path.exists(keyword_1[i]):
            os.makedirs(keyword_1[i])
        '''
        title_links = {}
        if len(keyword_2) == 0:
            title_links = {**title_links, **(news_search(keyword_1[i]))}
        else:
            for j in range(len(keyword_2)):
                title_links = {**title_links, **(news_search(keyword_1[i] + " " + keyword_2[j]))}
        url_to_html(title_links, keyword_1[i])


if __name__ == '__main__':
    keyword_combined(keyword_1, keyword_2)

 

상당히 길어보이지만, 사실 앞 부분만 잘 신경쓰면 된다.

# 오픈 API 아이디, 비번 (건드리지 말 것)
client_id = "xxxxxxxxxx"
client_secret = "xxxxxxxxxx"

여기에 앞서 어플리케이션에서 얻은 값들을 넣어준다.

# keyword_1 : 첫번째 키워드
# keyword_2 : 두번째 키워드
# keyword_3 : 세번째 키워드
# 첫번째 키워드 + 두번째 키워드로 검색이 진행됩니다.
# 예를 들어, 첫번째 키워드가 ['개', '고양이', '토끼'] 이고
# 두번째 키워드가 ['1', '2'] 이면,
# 개 1, 개 2, 고양이 1, 고양이 2, 토끼 1, 토끼 2 처럼
# 키워드 1 개수 * 키워드 2 개수 만큼 검색 쿼리가 생성됩니다.
# 세번째 키워드는, 추가적으로 단일 키워드를 검색하고 싶은 경우 활용합니다.

keyword_1 = ['강아지', '고양이']
keyword_2 = ['토끼', '공원']


display = 30 # 각 키워드 당 검색해서 저장할 기사 수

키워드에서는, keyword_1, keyword_2에 각각 조합될 키워드를 넣으면 된다.

예를 들어, 위의 경우는 각각 '강아지 토끼', '강아지 공원', '고양이 토끼', '고양이 공원'이렇게 총 4번(1의 갯수 * 2의 갯수)만큼 검색하고, 각각 display에 저장된 값(여기서는 30)만큼 검색을 한다음 이를 저장한다.

각 키워드별로 검색한 결과값은 '.html'파일로 저장된다.

위 파일은 '강아지.html'이 저장된 결과값이다.

 


 

깃헙에도 업로드를 해 놓았습니다. 편한 버전을 이용해서 사용해주시길!
Comments