공학속으로/python

[Python] 네이버API를 사용한 뉴스 검색 크롤링하기

더월드 2024. 9. 20.

 

①. 네이버 오픈 API 이용 신청하기

https://developers.naver.com/products/service-api/datalab/datalab.md

 

②. 애플리케이션 등록 (Application 메뉴 선택 > 애플리케이션 등록)

- 애플리케이션 이름

- 사용API

- 등록하기 버튼 클릭으로 완료.

등록을 완료하시면 Client ID와 Client Secret 정보를 받게 됩니다.

이 정보를 이용해서 네이버 OPEN API에 접근할 수 있습니다.

 

③. 네이버 오픈 API 목록

 

검색 네이버 블로그, 이미지, 웹, 뉴스, 백과사전, 책, 카페, 지식iN 등 검색 25,000회/일
네이버 로그인 외부 사이트에서 네이버 로그인 기능 구현 없음
네이버 회원 프로필 조회 네이버 회원 이름, 이메일 주소, 휴대전화번호, 별명, 성별, 생일, 연령대, 출생연도, 프로필 조회 없음
Papago 번역 Papago 번역 인공신경망 기반 기계 번역 10,000글자/일
CLOVA Face Recognition 입력된 사진을 입력받아 얼굴윤곽/부위/표정/유명인 닮음도를 리턴 1,000건/일
데이터랩(검색어트렌드) 통합검색어 트렌드 조회 1,000회/일
데이터랩(쇼핑인사이트) 쇼핑인사이트 분야별 트렌드 조회 1,000회/일
캡차(이미지) 자동 입력 방지용 보안 이미지 생성 및 입력값 비교 1,000회/일
캘린더 로그인한 사용자 캘린더에 일정 추가 가능 5,000회/일
카페 특정 네이버 카페 가입하기 50회/일
카페 네이버 회원이 가입한 카페 게시판에 글 쓰기 200회/일
단축URL 입력된 URL을 me2.do 형태의 짧은 URL로 변환 25,000회/일
공유하기 네이버 블로그, 카페 공유하기 없음

 

④. 개발자가이드의 예제 참고하시면 됩니다.

 

 

파이썬으로 네이버 뉴스 검색하기

① 위와 같이 네이버 API 사용신청해서, 클라이언트 ID와 비밀번호를 획득합니다.

# 네이버 API 정보 입력
client_id = "cxLC9~~~~~~~ZWtX";
client_secret = "nSSV_~~~~2";

 

② 네이버API를 사용한 뉴스 검색 코드

- 네이버API를 사용하여 뉴스를 검색하는 코드는 아래와 같습니다.

import requests
from datetime import datetime, timedelta

# 네이버 API 정보 입력
client_id = "cxLC9~~~~~~~ZWtX";
client_secret = "nSSV_~~~~2";

# 검색 함수
def search_naver_news(query):
    url = "https://openapi.naver.com/v1/search/news.json"
    headers = {
        "X-Naver-Client-Id": client_id,
        "X-Naver-Client-Secret": client_secret,
    }
    params = {
        "query": query,
        "display": 10,  # 최대 100개까지 가능
        "start": 1,
        "sort": "date"  # date: 날짜순, sim: 유사도순
    }
    
    response = requests.get(url, headers=headers, params=params)
    
    if response.status_code == 200:
        return response.json()['items']
    else:
        print("Error Code:", response.status_code)
        return None

 

③ 검색한 결과값에서 시간정렬하여 출력하기

# 게시 시간을 변환하는 함수
def convert_time(pub_date):
    # 예시 시간: 'Mon, 26 Aug 2024 17:32:00 +0900'
    dt = datetime.strptime(pub_date, '%a, %d %b %Y %H:%M:%S %z')
    return dt.strftime('%Y-%m-%d %H:%M:%S')
    
# 뉴스 검색 및 출력 함수
def print_news_results(query):
    news_items = search_naver_news(query)
    
    if news_items:
        # 게시 시간을 변환하고, 시간순으로 정렬
        for item in news_items:
            item['converted_pubDate'] = convert_time(item['pubDate'])
        
        # 정렬: 최신 뉴스가 가장 마지막에 오도록 정렬
        sorted_news = sorted(news_items, key=lambda x: x['converted_pubDate'])
        
        # 프로그램 실행일의 전날짜부터 출력
        yesterday = (datetime.now() - timedelta(days=1)).strftime('%Y-%m-%d')
        
        filtered_news = [
            item for item in sorted_news if item['converted_pubDate'] >= yesterday
        ]
        
        return filtered_news
    else:
        print(f"No results found for query: {query}")
        return []

 

전체코드

위 뉴스 검색, 시간정렬 코드들을 포함한 전체코드는 아래와 같습니다.

import requests
from datetime import datetime, timedelta

# 네이버 API 정보 입력
client_id = "cxLC9~~~~~~~ZWtX";
client_secret = "nSSV_~~~~2";

# 검색 함수
def search_naver_news(query):
    url = "https://openapi.naver.com/v1/search/news.json"
    headers = {
        "X-Naver-Client-Id": client_id,
        "X-Naver-Client-Secret": client_secret,
    }
    params = {
        "query": query,
        "display": 10,  # 최대 100개까지 가능
        "start": 1,
        "sort": "date"  # date: 날짜순, sim: 유사도순
    }
    
    response = requests.get(url, headers=headers, params=params)
    
    if response.status_code == 200:
        return response.json()['items']
    else:
        print("Error Code:", response.status_code)
        return None

# 게시 시간을 변환하는 함수
def convert_time(pub_date):
    # 예시 시간: 'Mon, 26 Aug 2024 17:32:00 +0900'
    dt = datetime.strptime(pub_date, '%a, %d %b %Y %H:%M:%S %z')
    return dt.strftime('%Y-%m-%d %H:%M:%S')

# 뉴스 검색 및 출력 함수
def print_news_results(query):
    news_items = search_naver_news(query)
    
    if news_items:
        # 게시 시간을 변환하고, 시간순으로 정렬
        for item in news_items:
            item['converted_pubDate'] = convert_time(item['pubDate'])
        
        # 정렬: 최신 뉴스가 가장 마지막에 오도록 정렬
        sorted_news = sorted(news_items, key=lambda x: x['converted_pubDate'])
        
        # 프로그램 실행일의 전날짜부터 출력
        yesterday = (datetime.now() - timedelta(days=1)).strftime('%Y-%m-%d')
        
        filtered_news = [
            item for item in sorted_news if item['converted_pubDate'] >= yesterday
        ]
        
        return filtered_news
    else:
        print(f"No results found for query: {query}")
        return []

if __name__ == '__main__':
    # "사건+사고" 검색
    print("검색어: 사건+사고")
    news_results = print_news_results("사건+사고")
    for item in news_results:
        print(f"게시 시간: {item['converted_pubDate']}")
        print(f"제목: {item['title']}")
        print(f"링크: {item['link']}")
        print(f"요약: {item['description']}\n")

 

결과

네이버API를 사용한 네이버뉴스 검색(검색어: '사건+사고')을 실행한 결과입니다.

댓글

💲 추천 글