지난 포스팅에 네이버 API를 이용해 뉴스기사를 가져오는 코드를 작성했었다.
2025.01.27 - [코드리뷰/chatGPT(Python)코드] - 네이버 API 이용해 헤드라인 뉴스 기사 가져오기
파이썬 코드에서 네이버 API를 호출해 간단하게 기사 제목과 기사링크를 가져오는 방식을 설명하였는데, 이번엔 한 걸음 더 들어가 기사 요약을 하는 프로그램을 만들어 보자.
1. 검색어를 입력하자.
네이버에서 뉴스를 검색할 키워드를 입력한다.
2. 네이버 API 호출
네이버 API 사용 인증이 완료되면 기사를 검색해 결과를 가져온다.
3. 기사 가져오기
기사 링크를 입력해 요약하는 코드를 작성한다.
기사 html 코드를 가져와 정제 (Clean Html)하고 요약본을 만든다. 뉴스 기사를 가져올 때는 API가 아닌 웹 크롤링을 이용한다. BeautifulSoup으로 html을 파싱한다.
4. 기사 요약하기
기사 전문에서 최대 3줄을 요약해 출력한다. 기사 요약 오픈소스 라이브러리를 이용해 보았으나 제대로 된 값을 가져오지 못했다. 웹 페이지 마다 html 구성이 다 다르다 보니 한 라이브러리에서 이들을 모두 수용하기는 어려웠을 것으로 판단된다. 아쉽지만 기사 몇 줄을 가져오는 방식으로 진행했다.
더 좋은 방법이 있다면 돈이 들어간다. 바로 chatGpt나 claude같은 LLM 모델의 API를 이용하는 것이다. clean 코드를 만들어 API를 호출해 기사를 요약하라고 하면 꽤 괜찮은 결과를 보여줄 것이다. 문제는 비용이다.
최근 DeepSeek가 혜성처럼 나타나 LLM 생태계를 파괴하고 있다. 사용자 입장에선 즐거운 일이다. 사용료가 내려갈 것이기 때문이다.
DeepSeek는 성능면에서 chatgpt 최신버전인 o1을 넘어선 결과도 보여주긴 하지만 아직 단정하긴 이르다. 몇 번 사용해 보니 안정성이나 친절함은 부족한 듯하다. 하지만 산출물은 꽤 만족스러웠다. API서비스는 준비 중인 것 같았다.
전체 소스 코드는 아래와 같다.
import requests
import json
from urllib.parse import quote
from bs4 import BeautifulSoup
import re
def clean_html_text(html_text):
"""HTML 텍스트를 정제하는 함수"""
# BeautifulSoup 객체 생성
soup = BeautifulSoup(html_text, 'html.parser')
# 스크립트, 스타일 태그 제거
for script in soup(["script", "style"]):
script.decompose()
# 텍스트 추출 및 정제
text = soup.get_text()
lines = [line.strip() for line in text.splitlines() if line.strip()]
text = ' '.join(lines)
# 불필요한 공백 제거
text = re.sub(r'\s+', ' ', text).strip()
return text
def get_article_content(url):
"""뉴스 기사 내용을 가져오는 함수"""
try:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers)
response.raise_for_status()
# HTML 파싱
soup = BeautifulSoup(response.text, 'html.parser')
# 네이버 뉴스의 경우
if 'news.naver.com' in url:
article = soup.select_one('#dic_area')
if article:
return clean_html_text(str(article))
# 다른 언론사 사이트의 경우
article = soup.find('article') or soup.find(class_=re.compile('article|content|news'))
if article:
return clean_html_text(str(article))
return None
except Exception as e:
print(f"기사 내용 가져오기 실패: {str(e)}")
return None
def summarize_text(text, max_sentences=3):
"""텍스트 요약 함수 (간단한 추출적 요약)"""
if not text:
return "요약 불가"
# 문장 분리
sentences = re.split(r'[.!?]\s+', text)
sentences = [s.strip() + '.' for s in sentences if len(s.strip()) > 10]
if not sentences:
return "요약 불가"
# 간단한 요약: 첫 몇 문장 선택
summary = ' '.join(sentences[:max_sentences])
return summary
def search_naver_news():
# 네이버 API 인증 정보
client_id = "네이버 API에서 발급" # 네이버 개발자 센터에서 발급
client_secret = "네이버 API에서 발급"
# 검색어 입력 받기
query = input("검색어를 입력하세요: ")
encoded_query = quote(query)
# API 요청 URL
url = f"https://openapi.naver.com/v1/search/news.json?query={encoded_query}&display=5&start=1"
# 헤더 설정
headers = {
"X-Naver-Client-Id": client_id,
"X-Naver-Client-Secret": client_secret
}
try:
# API 요청 보내기
response = requests.get(url, headers=headers)
# 응답 확인
if response.status_code == 200:
result = json.loads(response.text)
# 검색 결과 출력
print(f"\n'{query}' 검색 결과:\n")
for item in result['items']:
# HTML 태그 제거
title = item['title'].replace('<b>', '').replace('</b>', '')
print(f"제목: {title}")
print(f"링크: {item['link']}")
# 기사 내용 가져오기 및 요약
print("기사 요약 중...")
article_content = get_article_content(item['link'])
if article_content:
summary = summarize_text(article_content)
print(f"요약: {summary}")
else:
print("요약: 기사 내용을 가져올 수 없습니다.")
print("-" * 100)
print()
else:
print(f"Error Code: {response.status_code}")
print("에러가 발생했습니다. 다시 시도해주세요.")
except Exception as e:
print(f"오류가 발생했습니다: {str(e)}")
if __name__ == "__main__":
search_naver_news()
'코드리뷰 > chatGPT(Python)코드' 카테고리의 다른 글
네이버 부동산 매물정보 수집 프로그램 만들기 10분 컷 (1) | 2025.02.01 |
---|---|
네이버 API 이용해 헤드라인 뉴스 기사 가져오기 (0) | 2025.01.27 |
블로그 포스팅 자동화 구글 애드센스 수익 이어질까? (0) | 2025.01.26 |
댓글