💻프로그래밍/👩‍🔬빅데이터분석

네이버 API를 이용한 크롤링

hyerimmy 2021. 2. 10. 21:57
import os
import sys
import urllib.request
import datetime
import time
import json

client_id = 'qQzLdBLrgX38__G3RlUs'
client_secret = 'akgN0iUMMJ'


    
    
## [CODE1] : url 접속을 요청하고 응답을 받아 반환
def getRequestUrl(url):
    req = urllib.requeset.Request(url) #url에 대한 요청 보낼 객체 생성
    req.add_header("X-Naver-Client-Id", client_id) #API사용하기 위한 Client ID와 Client Secret 코드를 요청 객체 헤드에 추가
    req.add_header("X-Naver-Client-Secret", client_secret)
    
    try:
        response = urllib.request.urlopen(req) #요청객제에 대한 응답을 response 객체에 저장
        if response.getcode() == 200: #요청이 정상적으로 처리되었다면
            print("[%s] Url Requeset 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

        
        
## [CODE2] : 네이버 뉴스 검색 url을 만들고 [CODE1]의 getRequestUrl(url)을 호출하여 반환받은 응답데이터를 파이썬 json 형식으로 반환
def getNaverSearch(node, srcText, page_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 = getRequesetUrl(url) #[CODE1]
    
    if (responseDecode == None):
        return None
    else :
        return json.loads(responseDecode) #서버에서 받은 JSON형태의 응답 객체를 파이썬 객체로 로드하여 반환

    
    
##[CODE3] : JSON 형식의 응답 데이터를 필요한 항목만 정리하여 딕셔너리 리스트인 jsonResult를 구성하고 반환하도록 작성
def getPostData(post, jsonResult, cnt):
    #검색결과가 들어있는 post 객체에서 필요한 데이터 항목을 추출하여 변수에 저장
    title = post['title']
    description = post['description']
    org_link = post['originallink']
    link = post['link']
    
    pDate = datetime.datetime.strptime(post['pubDate'], '%a, %d %b %yY %H:%M:%S+0900')
    pDate = pDate.strftime('%Y-%m-%d %H:%M:%S')
    
    jsonResult.append({'cnt':cnt, 'title':title, 'description':description, 'org_link':org_link, 'link':org_link, 'pDate':pDate})
    return



## [CODE0]
def main():
    node = 'news' #크롤링 할 대상
    srcText = input('검색어를 입력하세요 : ')
    cnt = 0 #검색결과 카운트
    jsonResult = [] #검색결과 저장할 리스트 객체
    
    jsonResponse = getNaverSearch(node, srcText, 1, 100) #[CODE2]
    totall = jsonResponse['total'] #전체검색결과개수
    
    while ((jsonResponse != None) and (jsonResponse['display'] != 0)) :
        for post in jsonResponse['items']:
            cnt += 1
            getPostData(post, jsonResult, cnt) #[CODE3] #검색결과하나씩처리하는작업
            
        start = jsonResponse['start'] + jsonResponse['display'] #다음 검색결과 100개를 가져오기 위해 start 위치 변경
        jsonResponse = getNaverSearch(node, srcText, start, 100) #새로운 검색 결과 jsonResponse에 저장
        
    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)
        
    print("가져온 데이터 : %d 건" %(cnt))
    print('%s_naver_%s.json SAVED' % (srcText, node))
    
if __name__=='__main__' :
    main()