매일 아침 주요 뉴스를 확인하는 게 번거롭다면 Python으로 자동화해보세요. BeautifulSoup으로 뉴스를 크롤링하고, OpenAI API로 요약한 뒤, 이메일로 받아볼 수 있어요.
필요한 라이브러리 설치하기
터미널을 열고 필요한 패키지들을 설치해요. macOS에서는 pip3를 사용하는 게 좋아요.
pip3 install requests beautifulsoup4 openai
이메일 발송을 위한 smtplib는 Python에 기본 포함되어 있어서 별도 설치가 필요 없어요.
뉴스 사이트에서 헤드라인 가져오기
네이버 뉴스를 예시로 주요 헤드라인을 추출하는 코드예요. BeautifulSoup을 사용하면 HTML 구조를 쉽게 파싱할 수 있어요.
import requests
from bs4 import BeautifulSoup
def get_headlines(url="https://news.naver.com"):
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)'}
html = requests.get(url, headers=headers).text
soup = BeautifulSoup(html, 'html.parser')
# 네이버 뉴스 헤드라인 선택자
articles = soup.select('.cjs_t')
news_list = []
for article in articles[:10]: # 상위 10개 뉴스
title = article.text.strip()
link = article.get('href', '')
if link and not link.startswith('http'):
link = 'https://news.naver.com' + link
news_list.append({'title': title, 'link': link})
return news_list
User-Agent 헤더를 추가하면 서버가 정상적인 브라우저 요청으로 인식해요. macOS Safari의 User-Agent를 사용했어요.
각 기사 본문 추출하기
헤드라인만으로는 내용을 알기 어려우니 본문도 가져와요. 각 뉴스 링크에서 본문을 추출하는 함수를 만들어요.
def get_article_content(url):
try:
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)'}
html = requests.get(url, headers=headers, timeout=5).text
soup = BeautifulSoup(html, 'html.parser')
# 네이버 뉴스 본문 선택자
content = soup.select_one('#dic_area')
if content:
return content.text.strip()[:1000] # 1000자로 제한
return "본문을 가져올 수 없습니다."
except:
return "기사 내용 로드 실패"
OpenAI API로 뉴스 요약하기
OpenAI API 키가 필요해요. OpenAI 웹사이트에서 발급받은 후 사용하세요. 최신 모델인 gpt-4o-mini를 사용하면 비용을 절약할 수 있어요.
from openai import OpenAI
def summarize_article(content, api_key):
client = OpenAI(api_key=api_key)
try:
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "당신은 뉴스를 간결하게 요약하는 전문가입니다."},
{"role": "user", "content": f"다음 뉴스를 2-3문장으로 핵심만 요약해주세요:\n\n{content}"}
],
max_tokens=150,
temperature=0.3
)
return response.choices[0].message.content.strip()
except Exception as e:
return f"요약 실패: {str(e)}"
temperature를 낮게 설정하면 더 일관된 요약을 얻을 수 있어요.
Gmail로 요약 메일 보내기
Gmail을 사용해서 메일을 보내려면 앱 비밀번호가 필요해요. Google 계정 설정에서 2단계 인증을 활성화한 후 앱 비밀번호를 생성하세요.
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from datetime import datetime
def send_summary_email(summaries, sender_email, sender_password, receiver_email):
# 메일 내용 구성
subject = f"📰 {datetime.now().strftime('%Y년 %m월 %d일')} 뉴스 요약"
body = f"오늘의 주요 뉴스 요약입니다.\n\n"
for i, item in enumerate(summaries, 1):
body += f"{i}. {item['title']}\n"
body += f" {item['summary']}\n"
body += f" 원문: {item['link']}\n\n"
# 메일 객체 생성
msg = MIMEMultipart()
msg['Subject'] = subject
msg['From'] = sender_email
msg['To'] = receiver_email
msg.attach(MIMEText(body, 'plain', 'utf-8'))
# Gmail SMTP 서버로 전송
try:
with smtplib.SMTP_SSL('smtp.gmail.com', 465) as server:
server.login(sender_email, sender_password)
server.send_message(msg)
print("메일 전송 성공!")
except Exception as e:
print(f"메일 전송 실패: {e}")
전체 워크플로우 통합하기
모든 기능을 하나로 합쳐서 실행 가능한 스크립트를 만들어요.
import time
import os
from dotenv import load_dotenv
# 환경변수 로드 (선택사항)
load_dotenv()
def main():
# API 키와 이메일 정보
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY', 'your-api-key')
SENDER_EMAIL = os.getenv('SENDER_EMAIL', 'your-email@gmail.com')
SENDER_PASSWORD = os.getenv('SENDER_PASSWORD', 'your-app-password')
RECEIVER_EMAIL = os.getenv('RECEIVER_EMAIL', 'receiver@gmail.com')
print("뉴스 수집 시작...")
headlines = get_headlines()
summaries = []
for article in headlines[:5]: # 상위 5개만 처리
print(f"처리 중: {article['title']}")
# 본문 가져오기
content = get_article_content(article['link'])
# 요약하기
summary = summarize_article(content, OPENAI_API_KEY)
summaries.append({
'title': article['title'],
'link': article['link'],
'summary': summary
})
time.sleep(1) # API 호출 간격 조절
# 이메일 발송
print("메일 발송 중...")
send_summary_email(summaries, SENDER_EMAIL, SENDER_PASSWORD, RECEIVER_EMAIL)
if __name__ == "__main__":
main()
환경변수를 사용하면 민감한 정보를 코드에 직접 넣지 않아도 돼요. .env 파일을 만들어서 관리하는 게 안전해요.
macOS에서 자동 실행 설정하기
매일 아침 자동으로 실행되도록 cron을 설정해요. 터미널에서 crontab을 편집하세요.
crontab -e
다음 줄을 추가하면 매일 오전 7시에 실행돼요:
0 7 * * * /usr/bin/python3 /Users/your-username/news-summary/main.py >> /Users/your-username/news-summary/log.txt 2>&1
경로는 실제 파일 위치로 변경하세요. macOS Ventura 이상에서는 터미널에 전체 디스크 접근 권한을 줘야 할 수도 있어요.
추가 개선 아이디어
여러 뉴스 사이트를 동시에 크롤링하고 싶다면 각 사이트별로 파서 함수를 만들어요. RSS 피드를 활용하면 더 안정적으로 뉴스를 수집할 수 있어요.
def get_rss_news(feed_url):
import feedparser
feed = feedparser.parse(feed_url)
news_list = []
for entry in feed.entries[:10]:
news_list.append({
'title': entry.title,
'link': entry.link,
'summary': entry.get('summary', '')
})
return news_list
에러 처리와 로깅을 추가하면 문제가 생겼을 때 원인을 파악하기 쉬워요. 메일 템플릿을 HTML로 만들면 더 보기 좋은 뉴스레터를 만들 수 있어요.
2025.07.23 - [생산성] - 파이썬으로 엑셀 일간 업무보고서 자동 생성하는 완벽 가이드
파이썬으로 엑셀 일간 업무보고서 자동 생성하는 완벽 가이드
매일 반복되는 엑셀 업무보고서 작성에 지쳐있다면, 파이썬의 pandas와 openpyxl 라이브러리로 완전 자동화할 수 있어요. CSV나 엑셀 로그 파일을 읽어서 분석하고, 보고서 템플릿에 자동으로 데이터
qwanjk.tistory.com
'IT' 카테고리의 다른 글
| 파이썬으로 노션 할일 자동화하기: 매일 아침 오늘 날짜로 생성하는 방법 (9) | 2025.07.23 |
|---|---|
| Mac에서 파이썬으로 파일 확장자별 자동 정리하는 방법 (2) | 2025.07.23 |
| 파이썬으로 엑셀 일간 업무보고서 자동 생성하는 완벽 가이드 (2) | 2025.07.23 |
| 구글 캘린더 일정 생기면 슬랙으로 자동 알림 받는 방법 (3) | 2025.07.23 |
| 무료 백신 프로그램 진짜 써도 되나요? (3) | 2025.07.22 |