IT와 보안 그 어디 쯤
부동산 뉴스 요약해주는 파이썬 코드
깊음위에
2024. 9. 3. 05:58
반응형
이 코드는 네이버 API를 사용하여 부동산 관련 뉴스 기사를 가져오고, 각 기사의 내용을 요약하고 핵심 키워드를 추출한 후, 이를 설명하여 블로그 포스트 형식으로 저장하는 프로그램입니다. 아래에 각 부분과 실행에 필요한 사항을 설명하겠습니다.
코드 설명
- 라이브러리 임포트:
os
: 환경 변수 접근을 위한 모듈.requests
: HTTP 요청을 보내기 위한 모듈.json
: JSON 데이터 처리를 위한 모듈.dotenv
: 환경 변수를 로드하기 위한 모듈.BeautifulSoup
: HTML 파싱을 위한 라이브러리.openai
: OpenAI API와의 상호작용을 위한 라이브러리.
- 환경 변수 로드:
load_dotenv
:secrets.env
파일에서 API 키를 로드합니다.
- 네이버 뉴스 API 호출:
get_top_news()
: 네이버 뉴스 API를 호출하여 부동산 관련 최신 뉴스 3개를 가져옵니다.
- 기사 내용 가져오기:
get_article_content(url)
: 주어진 URL에서 기사의 HTML 내용을 가져와서 파싱합니다.
- 뉴스 요약:
summarize_news(content)
: OpenAI API를 사용하여 기사 내용을 요약합니다.
- 키워드 추출:
extract_keywords(content1)
: 기사 내용에서 핵심 키워드를 추출합니다.
- 키워드 설명:
explain_keywords(keywords)
: 추출된 키워드에 대한 설명을 생성합니다.
- 블로그 포스트 작성:
write_blog_post(news, summaries, keywords, explanations)
: 뉴스 제목, 요약, 키워드 및 설명을 포함하여 HTML 형식의 블로그 포스트를 작성합니다.
- HTML 파일 저장:
save_html(post, filename)
: 작성된 블로그 포스트를 HTML 파일로 저장합니다.
실행에 필요한 것들
- 필요한 라이브러리 설치:
pip install requests beautifulsoup4 python-dotenv openai
- 환경 변수 파일 생성:
secrets.env
파일을 생성하고 다음과 같은 내용을 추가합니다:
전체코드
import os
import requests
import json
from dotenv import load_dotenv
from bs4 import BeautifulSoup
import openai
load_dotenv(dotenv_path='secrets.env')
naver_client_id = os.getenv('YOUR_NAVER_CLIENT_ID')
naver_client_secret = os.getenv('YOUR_NAVER_CLIENT_SECRET')
openai.api_key = os.getenv('OPENAI_API_KEY')
def get_top_news():
url = "https://openapi.naver.com/v1/search/news.json?query=%EB%B6%80%EB%8F%99%EC%82%B0&display=3&sort=sim"
headers = {"X-Naver-Client-Id": naver_client_id, "X-Naver-Client-Secret": naver_client_secret}
response = requests.get(url, headers=headers)
news_data = response.json()
top_news = news_data['items']
return top_news
def get_article_content(url):
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
content = soup.find_all('article', {'class': 'go_trans _article_content'})
print(content) # 기사 내용을 출력합니다.
return content
def summarize_news(content):
client = openai.Client()
prompt = f"요약: {content}"
response = client.chat.completions.create(
model="gpt-4o-2024-05-13",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": prompt}
],
max_tokens=500
)
summary = response.choices[0].message.content.strip()
print(summary) # 기사 요약을 출력합니다.
return summary
def extract_keywords(content1):
client = openai.Client()
prompt = f"다음 내용에서 가장 이해하기 어려울만한 핵심용어 하나를 추출해 주세요. 답변에는 물론입니다와 같은 대답없이 바로 키워드 추출해주세요.: {content1}"
response = client.chat.completions.create(
model="gpt-4o-2024-05-13", # 또는 "gpt-4"로 변경 가능
messages=[
{"role": "user", "content": prompt}
],
max_tokens=200
)
keywords = response.choices[0].message.content.strip()
print(summary) # 기사 키워드 출력합니다.
return keywords
def explain_keywords(keywords):
client = openai.Client()
prompt = f"다음 키워드에 대한 설명을 작성해 주세요. 물론입니다와 같은 대답없이 바로 키워드 설명을 해주세요.: {keywords}"
response = client.chat.completions.create(
model="gpt-4o-2024-05-13", # 또는 "gpt-4"로 변경 가능
messages=[
{"role": "user", "content": prompt}
],
max_tokens=500
)
explanation = response.choices[0].message.content.strip()
print(explanation) # 기사 키워드 출력합니다.
return explanation
def write_blog_post(news, summaries, keywords, explanations):
post = "<h1>네이버 부동산 뉴스 요약</h1>"
for i in range(len(news)):
post += f"""
<h2>{news[i]['title']}</h2>
<p>{summaries[i]}</p>
<p>핵심 키워드: {keywords[i]}</p>
<p>키워드 설명: {explanations[i]}</p>
<p>원문 보기: <a href="{news[i]['link']}">여기</a></p>
"""
return post
def save_html(post, filename):
with open(filename, 'w', encoding='utf-8') as f:
f.write(post)
# 가장 많이 보는 부동산 기사를 가져옵니다.
news_list = get_top_news()
summaries = []
keywords = []
explanations = []
for news in news_list:
article_content = get_article_content(news['link'])
summary = summarize_news(article_content)
summaries.append(summary)
keyword = extract_keywords(article_content)
keywords.append(keyword)
explanation = explain_keywords(keyword)
explanations.append(explanation)
post = write_blog_post(news_list, summaries, keywords, explanations)
# 오늘 날짜를 파일 이름에 포함합니다.
today_date = datetime.now().strftime("%Y-%m-%d")
filename = f"blog_post_{today_date}.html"
# 블로그 글을 HTML 형식으로 저장합니다.
save_html(post, filename)
반응형