글 순서
이번에는 텔레그램 봇을 생성하고, 이전 시간에 작성했던 뉴스 스크래핑 코드를 수정하겠습니다. 새로운 뉴스가 있으면 해당 링크만 리스트로 결과를 반환하고 만약 새로운 뉴스가 없다면 빈 리스트를 반환하도록 작성하겠습니다.
텔레그램 봇 만들기
우선 텔레그램 봇을 만들겠습니다. 텔레그램을 열고 BotFather를 검색합니다.
채팅창이 열리면 /start 를 입력하면 봇을 생성하고 관리할 수 있는 안내 문구를 띄어줍니다. 우리는 처음 봇을 만드는 입장이니까 /newbot이라고 입력하면 됩니다. 안내에 따라서 bot name과 username을 입력합니다. 모두 입력이 끝나면 봇이 완성되었다고 알려줍니다.
완료 문구를 보시면 토큰(token)이 생성된 것을 알 수 있습니다. 토큰은 xxxxx:yyyyyyyy의 형태로 생겼습니다. 차후 이 토큰을 이용해서 파이썬 코드로 텔레그램 봇을 다룰 수 있습니다. 우리가 만든 봇을 검색해서 말을 걸어보겠습니다.
여기까지 잘 진행되었다면 봇이 잘 만들어진 겁니다.
파이썬으로 봇 다루기
파이썬에서 우리가 만든 봇을 다루기 위해서는 python-telegram-bot을 설치해야 합니다. 주피터 노트북을 열고 셀에 아래와 같이 설치 코드를 입력합니다.
!pip install python-telegram-bot
설치가 완료되었으면 이전 과정에서 만든 봇의 정보를 가져오겠습니다.
import telegram
token = '본인의 토큰을 붙여넣어주세요'
bot = telegram.Bot(token=token)
토큰을 이용해서 봇을 가져왔지만 아직 메시지를 보낼 수 없습니다. 누구에게 보내야 할지 모르기 때문입니다. 아까 봇에게 인사를 건네었었죠. 그 채팅을 이용해서 제 id를 알아오겠습니다.
for i in bot.getUpdates():
print(i.message)
붉은색 박스 위치가 메시지를 보낸 본인의 텔레그램 id입니다. id를 알았으니 이제부터 다음과 같은 코드를 이용해서 원하는 메시지를 나에게 전할 수 있습니다.
bot.sendMessage(chat_id='아이디', text='쓰고 싶은 말')
뉴스 링크 스크랩핑 코드 수정하기
이전에 작성했던 뉴스 링크 스크래핑 코드를 약간 수정하겠습니다. 모든 뉴스 링크를 전달하기보다는 매번 상위 5개 링크만 추출해서, 이중 새로 등록된 기사만 전달하는 방식으로 작성하겠습니다.
# 라이브러리 불러오기
import requests
from bs4 import BeautifulSoup
import telegram
# 서치 키워드
search_word = '삼성전자'
# 기존에 보냈던 링크를 담아둘 리스트
old_links = []
# 스크래핑 함수
def extract_links(old_links=[]):
url = f'https://m.search.naver.com/search.naver?where=m_news&sm=mtb_jum&query={search_word}'
req = requests.get(url)
html = req.text
soup = BeautifulSoup(html, 'html.parser')
search_result = soup.select_one('#news_result_list')
news_list = search_result.select('.bx > .news_wrap > a')
links = []
for news in news_list[:5]:
link = news['href']
links.append(link)
new_links=[]
for link in links:
if link not in old_links:
new_links.append(link)
return new_links
# 이전 링크를 매개변수로 받아서, 비교 후 새로운 링크만 출력
# 차후 이 부분을 메시지 전송 코드로 변경하고 매시간 동작하도록 설정
# 새로운 링크가 없다면 빈 리스트 반환
for i in range(3):
new_links = extract_links(old_links)
print('===보낼 링크===\n', new_links,'\n')
old_links += new_links.copy()
old_links = list(set(old_links))
"""
===보낼 링크===
['https://m.news.naver.com/read.nhn?mode=LSD&mid=sec&sid1=101&oid=008&aid=0004349743', 'http://it.chosun.com/site/data/html_dir/2020/01/31/2020013103216.html', 'https://m.news.naver.com/read.nhn?mode=LSD&mid=sec&sid1=101&oid=031&aid=0000523810', 'https://m.news.naver.com/read.nhn?mode=LSD&mid=sec&sid1=102&oid=001&aid=0011371561', 'http://www.fintechpost.co.kr/news/articleView.html?idxno=100097']
===보낼 링크===
[]
===보낼 링크===
[]
"""
다음 시간에는 스케쥴러를 이용해서 매시간마다 뉴스 링크를 수집하고, 그 결과를 텔레그램 메시지로 보내는 방법을 알아보겠습니다.
- 이 글은 아나콘다(Anaconda3)가 설치된 주피터 노트북에서 작성되었습니다.