IT와 보안 그 어디 쯤

부동산 뉴스 요약해주는 파이썬 코드

깊음위에 2024. 9. 3. 05:58
반응형

이 코드는 네이버 API를 사용하여 부동산 관련 뉴스 기사를 가져오고, 각 기사의 내용을 요약하고 핵심 키워드를 추출한 후, 이를 설명하여 블로그 포스트 형식으로 저장하는 프로그램입니다. 아래에 각 부분과 실행에 필요한 사항을 설명하겠습니다.

코드 설명

  1. 라이브러리 임포트:
    • os: 환경 변수 접근을 위한 모듈.
    • requests: HTTP 요청을 보내기 위한 모듈.
    • json: JSON 데이터 처리를 위한 모듈.
    • dotenv: 환경 변수를 로드하기 위한 모듈.
    • BeautifulSoup: HTML 파싱을 위한 라이브러리.
    • openai: OpenAI API와의 상호작용을 위한 라이브러리.
  2. 환경 변수 로드:
    • load_dotenv: secrets.env 파일에서 API 키를 로드합니다.
  3. 네이버 뉴스 API 호출:
    • get_top_news(): 네이버 뉴스 API를 호출하여 부동산 관련 최신 뉴스 3개를 가져옵니다.
  4. 기사 내용 가져오기:
    • get_article_content(url): 주어진 URL에서 기사의 HTML 내용을 가져와서 파싱합니다.
  5. 뉴스 요약:
    • summarize_news(content): OpenAI API를 사용하여 기사 내용을 요약합니다.
  6. 키워드 추출:
    • extract_keywords(content1): 기사 내용에서 핵심 키워드를 추출합니다.
  7. 키워드 설명:
    • explain_keywords(keywords): 추출된 키워드에 대한 설명을 생성합니다.
  8. 블로그 포스트 작성:
    • write_blog_post(news, summaries, keywords, explanations): 뉴스 제목, 요약, 키워드 및 설명을 포함하여 HTML 형식의 블로그 포스트를 작성합니다.
  9. HTML 파일 저장:
    • save_html(post, filename): 작성된 블로그 포스트를 HTML 파일로 저장합니다.

실행에 필요한 것들

  1. 필요한 라이브러리 설치:
  2. pip install requests beautifulsoup4 python-dotenv openai
  3. 환경 변수 파일 생성:
    • 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)
반응형