반응형
안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.
코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.
업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

오늘은 지난번 계획했던 원하는 주제의 네이버 뉴스 텔레그램으로 주기적으로 전송 받는 프로젝트를 완료해서 공유할 겸 글을 씁니다.
<해당 프로젝트 관련된 이전 글>
2021.04.03 - [파이썬 프로젝트] - Python으로 Telegram bot 사용하는 법 (feat. 공시정보알림 탤레그램 봇 소개)
2021.04.04 - [파이썬 패키지] - 파이썬 텔레그램 봇 개념 총정리(python-telegram-bot)
전체 코드는 아래와 같으니, 필요하신 분들은 마음껏 가져다 쓰셔도 됩니다. 최대한 자세하게 주석을 달아놓았으니 보고 모르시는 것 있으시면 댓글로 질문해주세요. 개선에 대한 아이디어도 환영입니다!
#step1.라이브러리 불러오기
import requests
from bs4 import BeautifulSoup as bs
import telegram
import schedule
import time
#step2.새로운 네이버 뉴스 기사 링크를 받아오는 함수
def get_new_links(old_links=[]):
# (주의) 네이버에서 키워드 검색 - 뉴스 탭 클릭 - 최신순 클릭 상태의 url
url = f'https://search.naver.com/search.naver?where=news&query={query}&sm=tab_opt&sort=1&photo=0&field=0&pd=0&ds=&de=&docid=&related=0&mynews=0&office_type=0&office_section_code=0&news_office_checked=&nso=so%3Add%2Cp%3Aall&is_sug_officeid=0'
# html 문서 받아서 파싱(parsing)
response = requests.get(url)
soup = bs(response.text , 'html.parser')
# 해당 페이지의 뉴스기사 링크가 포함된 html 요소 추출
news_titles = soup.select('a.news_tit')
# 요소에서 링크만 추출해서 리스트로 저장
list_links = [i.attrs['href'] for i in news_titles]
# 기존의 링크와 신규 링크를 비교해서 새로운 링크만 저장
new_links = [link for link in list_links if link not in old_links]
return new_links
#step3.새로운 네이버 뉴스 기사가 있을 때 텔레그램으로 전송하는 함수
def send_links():
# 함수 내에서 처리된 리스트를 함수 외부에서 참조하기 위함
global old_links
# 위에서 정의했던 함수 실행
new_links = get_new_links(old_links)
# 새로운 메시지가 있으면 링크 전송
if new_links:
for link in new_links:
bot.sendMessage(chat_id=chat_id, text=link)
# 없으면 패스
else:
pass
# 기존 링크를 계속 축적하기 위함
old_links += new_links.copy()
# 실제 프로그램 구동
if __name__ == '__main__':
#토큰을 변수에 저장
bot_token ='자신이 생성한 봇의 토큰 정보'
bot = telegram.Bot(token = bot_token)
#가장 최근에 온 메세지의 정보 중, chat id만 가져옴 (이 chat id는 사용자(나)의 계정 id임)
chat_id = bot.getUpdates()[-1].message.chat.id
#step4.검색할 키워드 설정
query = input('크롤링 할 뉴스기사 키워드를 입력하세요: ')
#위에서 얻은 chat id로 bot이 메세지를 보냄.
bot.sendMessage(chat_id = chat_id, text=f"{query}를 주제로 뉴스 기사 크롤링이 시작 되었습니다")
#step5.기존에 보냈던 링크를 담아둘 리스트 만들기
old_links = []
# 주기적 실행과 관련된 코드 (hours는 시, minutes는 분, seconds는 초)
job = schedule.every(10).seconds.do(send_links)
while True:
schedule.run_pending()
time.sleep(1)
반응형