네이버 뉴스 API로 한번에 크롤링하기

네이버의 뉴스를 API로 크롤링하는 방법을 알아보겠습니다.

 

먼제 네이버 디벨로퍼에 들어가서 API를 신청해야 합니다.

 

네이버 API 신청하기

https://developers.naver.com/main/

 

NAVER Developers

네이버 오픈 API들을 활용해 개발자들이 다양한 애플리케이션을 개발할 수 있도록 API 가이드와 SDK를 제공합니다. 제공중인 오픈 API에는 네이버 로그인, 검색, 단축URL, 캡차를 비롯 기계번역, 음

developers.naver.com

그다음 하단에 서비스 API를 신청합니다.

이 후 검색 API에 대해서 등록을 합니다.

이 제 이 api를 파이썬으로 불러와야 하는데요.

 

방금 발급받은 클라이언트 ID와 패스워드를 저장해 놓습니다.

 

# 네이버 검색 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 os
import sys
import urllib.request
import datetime
import time
import json
import pandas as pd
import re


client_id = 'ID'
client_secret = '비밀번호'

title1 = []
pDate1 = []
description1 = []
org_link1 =[]
link1 = []
dt_now = datetime.datetime.now().strftime('%Y-%m-%d')

#[CODE 1]
def getRequestUrl(url):
    req = urllib.request.Request(url)
    req.add_header("X-Naver-Client-Id", client_id)
    req.add_header("X-Naver-Client-Secret", client_secret)
    
    try:
        response = urllib.request.urlopen(req)
        if response.getcode() == 200:
            print("[%s]Url Request Success" % datetime.datetime.now())
            return response.read().decode('utf-8')
    except Exception as e :
        print(e)
        print("[%s] Error for URL : %s" % (datetime.datetime.now(), url))
        return None

#[CODE 2]
def getNaverSearch(node, srcText, start, display):
    base = "https://openapi.naver.com/v1/search"
    node = "/%s.json" % node
    parameters = "?query=%s&start=%s&display=%s" % (urllib.parse.quote(srcText), start, display)

    url = base + node + parameters
    responseDecode = getRequestUrl(url)     #[CODE 1]

    if(responseDecode == None):
        return None
    else:
        return json.loads(responseDecode)

#[CODE 3]
def getPostData(post, jsonResult, cnt):
    cleanr = re.compile('<.*?>')
    
    title = post['title']
    titlec = re.sub(cleanr, '', title)
    description = post['description']
    descriptionc = re.sub(cleanr, '', description)
    org_link = post['originallink']
    link = post['link']

    pDate = datetime.datetime.strptime(post['pubDate'], '%a, %d %b %Y %H:%M:%S +0900')
    pDate = pDate.strftime('%Y-%m-%d %H:%M:%S')

    title1.append(titlec)
    description1.append(descriptionc)
    org_link1.append(org_link)
    link1.append(link)
    pDate1.append(pDate)

    jsonResult.append({'cnt':cnt, 'title':title, 'description':description,
                       'org_link':org_link, 'link':org_link, 'pDate':pDate})
    return

#[CODE 0]
def main():
    node = 'news'  #크롤링한 대상
    srcText = input('검색어를 입력하세요: ')
    cnt = 0
    jsonResult = []
    
    jsonResponse = getNaverSearch(node, srcText, 1, 100)  #[CODE 2]
    total = jsonResponse['total']
    
    while((jsonResponse != None) and (jsonResponse['display'] != 0)):
        for post in jsonResponse['items']:
            cnt+= 1
            getPostData(post, jsonResult, cnt)   #[CODE 3]
            
        start = jsonResponse['start'] + jsonResponse['display']
        jsonResponse = getNaverSearch(node, srcText, start, 100)   #[CODE 2]
        
    print('전체 검색 : %d 건' %total)
        
    #with open('%s_naver_%s.json' % (srcText, node), 'w', encoding='utf8') as outfile:
    #    jsonFile = json.dumps(jsonResult, indent=4, sort_keys = True, ensure_ascii = False)
            
    #    outfile.write(jsonFile)
        
    df=pd.DataFrame([title1, pDate1, description1, org_link1, link1 ]).T
    df.columns=['제목','날짜','내용','원래주소','네이버뉴스주소']
    df.to_excel('log/'+dt_now+srcText+'.xlsx')

            
    print("가져온 데이터 : %d 건" %(cnt))
    #print('%s_naver_%s.json SAVED' % (srcText, node))

if __name__ == '__main__':
    main()

 

log 폴더에 오늘 날짜 검색어로 추가해서 저장하도록 했는데요.

 

이건 자유롭게 수정해서 사용하시면 될 것 같네요.