📋 목차
매일 아침 특정 키워드 뉴스만 골라서 이메일로 받는 파이썬 자동화, 코드 50줄이면 충분하더라고요. 실제로 3개월째 돌리고 있는 스크립트 구조와 삽질 경험까지 공유합니다.
저는 업무상 특정 산업 뉴스를 매일 체크해야 하는 사람이에요. 처음엔 네이버 뉴스 탭 열고, 구글 뉴스 열고, 키워드 검색하고. 이걸 하루에 두세 번씩 반복했거든요. 솔직히 뉴스 검색 자체보다 브라우저 열고 로그인하고 스크롤하는 그 루틴이 더 피곤했어요.
그래서 파이썬으로 뉴스 수집 자동화를 만들었는데, 결론부터 말하면 진작 할 걸 싶었습니다. 아침에 눈 뜨면 Gmail 받은편지함에 어젯밤부터 오늘 새벽까지 나온 뉴스가 깔끔하게 정리돼 있거든요. 커피 마시면서 제목만 쭉 훑으면 되니까 시간이 확 줄었어요.
매일 뉴스 검색하다 지쳐서 만든 자동화
회사에서 경쟁사 동향이랑 업계 이슈를 트래킹해야 하는 업무가 있었어요. 키워드가 한두 개가 아니라 “AI 반도체”, “전기차 배터리”, “탄소중립” 이런 식으로 5~6개였거든요. 매번 각각 검색해서 읽다 보면 아침 한 시간이 뉴스 검색으로 날아갔어요.
구글 알리미(Google Alerts)도 써봤는데, 이게 원하는 시간에 안 오는 경우가 많았어요. 어떤 날은 오전 10시에, 어떤 날은 오후 3시에. 그리고 뉴스 퀄리티 필터링이 안 돼서 블로그 글이나 보도자료 원문이 섞여 들어오더라고요.
그때 든 생각이, 파이썬으로 직접 만들면 내가 원하는 키워드, 원하는 시간, 원하는 형식으로 받을 수 있지 않을까 하는 거였죠. 실제로 만들어보니 코드 자체는 50줄 내외로 간단했고, 오히려 Gmail 앱 비밀번호 설정하는 데 더 시간이 걸렸어요.
지금은 매일 오전 7시에 자동으로 돌아가고 있고, 출근 전 커피 타는 동안 메일을 쭉 훑습니다. 키워드별로 섹션이 나뉘어 있어서 한눈에 파악이 되거든요.
전체 구조부터 이해하면 코드가 쉬워진다
파이썬 뉴스 자동화의 전체 흐름은 딱 세 단계예요. 뉴스 수집, 이메일 작성, 자동 실행. 이 세 가지가 각각 독립적인 모듈이라서, 하나만 바꾸고 싶을 때 나머지를 건드릴 필요가 없어요.
뉴스 수집은 구글 뉴스 RSS 피드를 feedparser 라이브러리로 파싱하는 방식이에요. BeautifulSoup으로 직접 크롤링하는 방법도 있지만, RSS를 쓰면 사이트 구조 변경에 영향을 덜 받아요. 저도 처음에 네이버 뉴스를 BeautifulSoup으로 크롤링했다가 한 달 만에 HTML 구조가 바뀌어서 코드가 깨진 적이 있거든요.
이메일 발송은 파이썬 내장 라이브러리인 smtplib와 email 모듈을 씁니다. 외부 패키지 설치 없이 바로 쓸 수 있어서 편하고, Gmail SMTP 서버를 경유하면 무료로 하루 500통까지 발송 가능해요.
📊 실제 데이터
구글 뉴스 RSS는 키워드당 최대 약 100개의 뉴스 항목을 반환해요. 제가 5개 키워드로 돌려보니 평균적으로 키워드당 20~40개 정도가 24시간 이내 신규 기사로 잡혔고, 수집부터 이메일 발송까지 소요 시간은 평균 8초 내외였습니다.
자동 실행은 schedule 라이브러리를 쓰거나, 윈도우 작업 스케줄러, 리눅스 crontab을 활용해요. 저는 처음에 schedule 라이브러리를 썼다가 나중에 crontab으로 바꿨는데, 이유는 뒤에서 자세히 다룰게요.
필요한 라이브러리를 정리하면 이렇습니다.
| 구분 | 라이브러리 | 설치 필요 여부 |
|---|---|---|
| 뉴스 수집 | feedparser | pip install 필요 |
| 이메일 발송 | smtplib, email | 내장 (설치 불필요) |
| 스케줄링 | schedule 또는 crontab | schedule만 pip install |
| HTML 파싱 (선택) | BeautifulSoup4 | pip install 필요 |
구글 뉴스 RSS로 키워드 뉴스 수집하기
구글 뉴스는 공식적으로 RSS 피드를 제공하고 있어요. 핵심 URL 형식은 이거예요.
https://news.google.com/rss/search?q=키워드&hl=ko&gl=KR&ceid=KR:ko
여기서 q= 뒤에 원하는 키워드를 넣으면 되고, hl=ko와 gl=KR로 한국어 뉴스만 필터링할 수 있어요. 여러 키워드를 동시에 검색하고 싶으면 q=AI+반도체처럼 +로 연결하거나, 정확한 구문 검색은 큰따옴표로 감싸면 됩니다.
feedparser로 이 RSS를 파싱하는 코드는 정말 짧아요. pip install feedparser로 설치한 뒤, import feedparser 하고 parse() 함수에 URL을 넘기면 끝이에요. 반환되는 객체에서 entries를 순회하면 각 뉴스의 제목(title), 링크(link), 발행일(published)을 바로 꺼낼 수 있습니다.
제가 실제로 쓰는 방식은, 키워드 리스트를 만들어놓고 for문으로 각 키워드마다 RSS를 파싱한 뒤 결과를 딕셔너리에 담는 거예요. 나중에 이메일 본문을 만들 때 키워드별로 섹션을 나눌 수 있어서 깔끔하거든요. 한 가지 팁인데, feedparser가 반환하는 published 날짜가 표준 시간대(UTC)라서 한국 시간으로 변환하려면 +9시간을 더해야 해요. 저는 이걸 모르고 처음에 “왜 미래 기사가 나오지?” 하고 헷갈렸어요.
그리고 뉴스가 너무 많으면 읽기 부담되니까, 저는 키워드당 최신 5개씩만 잘라서 담고 있어요. entries[:5] 이렇게 슬라이싱하면 돼요.
smtplib로 수집한 뉴스 이메일 발송하기
이메일 발송 부분이 이 자동화의 핵심인데요. smtplib는 파이썬에 기본 내장돼 있어서 별도 설치가 필요 없어요. 다만 Gmail로 보내려면 사전 준비가 하나 필요합니다. 바로 앱 비밀번호 발급이에요.
Gmail 앱 비밀번호는 구글 계정 설정에서 2단계 인증을 먼저 활성화한 뒤, 보안 탭에서 “앱 비밀번호”를 검색하면 생성할 수 있어요. 16자리 비밀번호가 나오는데, 이걸 코드에서 로그인용으로 사용하면 됩니다. 일반 비밀번호로는 2022년부터 SMTP 로그인이 차단되고 있어서 앱 비밀번호가 필수예요.
⚠️ 주의
앱 비밀번호를 코드에 하드코딩하면 보안상 위험합니다. 환경 변수(os.environ)나 별도 .env 파일에 저장하고 .gitignore에 추가하는 방식을 강력히 권장해요. 저도 처음에 깃허브에 코드 올리면서 비밀번호가 노출된 적이 있는데, 구글에서 바로 경고 메일이 오더라고요.
이메일 본문은 HTML 형식으로 보내는 게 훨씬 보기 좋아요. email.mime.multipart의 MIMEMultipart와 email.mime.text의 MIMEText를 사용합니다. MIMEText에 ‘html’을 지정하면 HTML 태그가 적용된 예쁜 이메일을 보낼 수 있거든요.
제가 실제 쓰는 이메일 본문 구조는 이래요. 상단에 날짜와 키워드 수, 그 아래로 키워드별 섹션이 나오고, 각 뉴스는 제목(클릭하면 원문 링크)과 발행 시간으로 구성돼요. 최소한의 CSS 인라인 스타일만 넣으면 깔끔하게 나옵니다.
smtplib.SMTP_SSL(‘smtp.gmail.com’, 465)로 서버에 연결하고, login()으로 인증한 뒤, sendmail()로 보내면 끝이에요. 연결은 with 문으로 감싸서 자동으로 닫히게 하는 게 좋습니다. 간혹 연결이 끊기는 경우가 있는데, try-except로 감싸서 재시도 로직을 넣어두면 안정적이에요.
매일 아침 자동 실행되게 스케줄링 거는 법
자동화의 완성은 스케줄링이에요. 아무리 좋은 스크립트도 매번 수동으로 실행하면 의미가 없잖아요. 방법이 크게 세 가지 있는데, 각각 장단점이 확실해요.
첫 번째는 schedule 라이브러리예요. pip install schedule로 설치하고, schedule.every().day.at(“07:00”).do(함수명)처럼 직관적인 문법으로 예약할 수 있어요. 파이썬 코드 안에서 완결되니까 관리가 편하죠. 근데 치명적인 단점이 있어요. 스크립트가 계속 실행 상태로 떠 있어야 한다는 거예요. 컴퓨터를 끄거나 터미널을 닫으면 스케줄도 같이 죽습니다.
두 번째는 윈도우 작업 스케줄러예요. 윈도우 사용자라면 이게 가장 현실적이에요. 작업 스케줄러를 열고 새 작업을 만든 뒤, 트리거에서 “매일 오전 7시”를 설정하고, 동작에서 python.exe 경로와 스크립트 파일 경로를 지정하면 돼요. 컴퓨터가 켜져 있기만 하면 자동으로 실행됩니다.
세 번째는 리눅스/맥 crontab이에요. 터미널에서 crontab -e를 입력한 뒤 0 7 * * * /usr/bin/python3 /경로/news_bot.py라고 한 줄 추가하면 됩니다. 매일 7시 0분에 실행되는 거예요. 서버에서 돌린다면 이 방식이 가장 안정적이에요.
💡 꿀팁
schedule 라이브러리는 프로토타입 테스트용으로 쓰고, 실제 운영은 작업 스케줄러나 crontab으로 넘어가는 게 좋아요. 저도 처음에 schedule로 돌리다가 노트북 덮으면 멈추는 바람에 이틀 연속 뉴스를 못 받았거든요. 그 이후로 바로 crontab으로 바꿨어요.
삽질 3번 하고 깨달은 실전 주의사항
첫 번째 삽질. RSS 피드 URL에 한글 키워드를 그대로 넣으면 간혹 인코딩 에러가 나요. urllib.parse의 quote() 함수로 키워드를 URL 인코딩해서 넣어야 안전합니다. “전기차”를 %EC%A0%84%EA%B8%B0%EC%B0%A8로 변환해주는 거예요. 이것 때문에 처음에 빈 결과만 계속 받았어요.
두 번째 삽질은 Gmail 발송 한도예요. 무료 Gmail 계정은 하루 500통, Google Workspace 계정은 2,000통이 한도거든요. 저처럼 본인한테만 보내는 거면 전혀 문제없지만, 팀원 여러 명한테 보내려고 수신자를 늘렸더니 일주일쯤 지나서 “일일 발송 한도 초과” 에러가 떴어요. 수신자가 많다면 sendmail() 한 번에 리스트로 넘기는 게 나아요. 개별 발송보다 한도를 아낄 수 있습니다.
세 번째 삽질은 중복 뉴스 문제였어요. 구글 뉴스 RSS에 같은 기사가 소스만 다르게 여러 개 올라오는 경우가 많거든요. 제목을 기준으로 유사도를 비교하거나, 간단하게 뉴스 링크의 도메인을 기준으로 중복 제거하는 로직을 넣으면 깔끔해져요. 저는 뉴스 제목에서 공백과 특수문자를 제거한 뒤 set에 담아서 중복을 걸러내고 있어요.
그리고 예상 못한 건데, 가끔 구글 뉴스 RSS가 일시적으로 응답을 안 주는 경우가 있어요. 한 달에 한두 번 정도? 이런 경우를 대비해서 requests.get()에 timeout 파라미터를 넣고, 실패 시 3회 재시도 로직을 추가해두는 게 좋습니다.
한 단계 더, 클라우드에서 24시간 돌리기
로컬 컴퓨터에서 돌리는 게 가장 간단하지만, 컴퓨터를 항상 켜둬야 한다는 게 불편하잖아요. 저도 처음 2주는 집 데스크톱에서 돌렸는데, 출장 가면 뉴스가 안 오더라고요. 그래서 클라우드로 옮겼어요.
가장 간편한 방법은 PythonAnywhere예요. 무료 플랜에서 하루 1번 스케줄 태스크를 제공하거든요. 가입하고, 파이썬 파일을 업로드하고, Tasks 탭에서 실행 시간을 지정하면 끝이에요. 무료 플랜의 제약이라면 외부 사이트 접속이 제한될 수 있다는 건데, 구글 뉴스 RSS는 허용 목록에 포함돼 있어서 문제없었어요.
AWS Lambda + CloudWatch Events 조합도 괜찮아요. Lambda에 함수를 등록하고 CloudWatch에서 cron 표현식으로 트리거를 설정하면 서버리스로 돌릴 수 있거든요. 다만 초기 세팅이 좀 복잡해서, 클라우드 경험이 없다면 PythonAnywhere부터 시작하는 게 현실적입니다.
💬 직접 써본 경험
PythonAnywhere 무료 플랜으로 3개월째 돌리고 있는데, 지금까지 실패한 적이 딱 2번이에요. 한 번은 구글 뉴스 RSS 서버 자체가 일시 장애였고, 한 번은 제가 코드를 수정하다가 문법 에러를 남긴 거였어요. 월 비용 0원에 이 정도면 충분하다고 느끼고 있어요.
Google Colab으로 돌리려는 분도 계실 텐데, Colab은 스케줄링 기능이 없어서 자동화에는 적합하지 않아요. 수동 실행이나 테스트 용도로만 사용하는 게 맞습니다. 한때 Colab에 while True 루프를 걸어두는 꼼수가 돌았는데, 세션이 끊기면 바로 멈추기 때문에 신뢰할 수 없어요.
나중에 확장하고 싶다면 슬랙이나 텔레그램 봇으로 뉴스를 보내는 것도 가능해요. smtplib 대신 슬랙 Webhook URL이나 텔레그램 Bot API를 호출하면 되거든요. 저는 회사 팀 채널에 슬랙 버전도 따로 만들어서 운영하고 있습니다.
자주 묻는 질문
Q. 파이썬을 처음 배우는데 이 자동화를 만들 수 있나요?
기본적인 변수, 반복문, 함수 개념만 알면 충분히 가능해요. 외부 라이브러리 설치(pip install)와 import 사용법 정도만 추가로 알면 되고, 코드 자체가 50줄 이내라서 입문 프로젝트로도 적당합니다.
Q. 네이버 뉴스도 RSS로 수집할 수 있나요?
네이버 뉴스 자체의 공식 RSS는 제한적이에요. 대신 각 언론사가 제공하는 RSS 피드를 활용하거나, 네이버 뉴스 검색 결과 페이지를 BeautifulSoup으로 크롤링하는 방법이 있어요. 다만 크롤링은 사이트 이용약관과 robots.txt를 반드시 확인해야 합니다.
Q. Gmail 말고 네이버 메일이나 카카오 메일로도 보낼 수 있나요?
네, SMTP 서버 주소와 포트만 바꾸면 돼요. 네이버 메일은 smtp.naver.com(포트 587), 다음 메일은 smtp.daum.net(포트 465)을 사용합니다. 각 서비스의 SMTP 허용 설정을 먼저 켜야 하는 점은 동일해요.
Q. 뉴스 본문 전체를 가져올 수는 없나요?
RSS 피드에는 기본적으로 제목, 링크, 요약만 포함돼요. 본문 전체가 필요하면 newspaper3k 라이브러리로 각 기사 URL에서 본문을 추출할 수 있지만, 이러면 수집 시간이 길어지고 언론사별로 파싱 실패율이 올라가요. 제목과 링크만으로도 충분히 뉴스 트래킹이 됩니다.
Q. 하루에 여러 번 받고 싶으면 어떻게 하나요?
스케줄을 여러 개 등록하면 돼요. crontab이라면 0 7,12,18 * * *처럼 쉼표로 시간을 나열하면 하루 3번 실행됩니다. 다만 너무 자주 돌리면 같은 뉴스가 반복해서 오니까, 이전에 보낸 뉴스 링크를 파일에 저장해두고 중복 체크하는 로직을 추가하는 게 좋아요.
본 포스팅은 개인 경험과 공개 자료를 바탕으로 작성되었으며, 전문적인 의료·법률·재무 조언을 대체하지 않습니다. 정확한 정보는 해당 분야 전문가 또는 공식 기관에 확인하시기 바랍니다.
파이썬 뉴스 자동화는 feedparser로 RSS를 수집하고, smtplib로 이메일을 보내고, crontab이나 작업 스케줄러로 매일 실행시키는 세 단계가 전부예요. 코드 양도 적고 유지보수도 간단해서, 업무용 뉴스 모니터링이 필요한 분이라면 주말 오후 한 번 투자로 매일 아침을 편하게 만들 수 있습니다. 프로그래밍 초보자에게도 좋은 첫 자동화 프로젝트가 될 거예요.
도움이 됐다면 댓글로 어떤 키워드 뉴스를 자동화하고 싶은지 알려주세요. 비슷한 자동화 주제가 궁금하다면 공유도 부탁드려요.