본문 바로가기

카테고리 없음

파이썬으로 뉴스 알림 텔레그램 봇 만들기(2): 새로운 뉴스 링크만 추출하기

글 순서

(1) 사이트 구조 살펴보기, 뉴스 링크 수집하기

(2) 봇 만들기, 새로운 뉴스 링크만 추출하기

(3) 스케쥴러 만들기, 매 시간 메시지 보내기


이번에는 텔레그램 봇을 생성하고, 이전 시간에 작성했던 뉴스 스크래핑 코드를 수정하겠습니다. 새로운 뉴스가 있으면 해당 링크만 리스트로 결과를 반환하고 만약 새로운 뉴스가 없다면 빈 리스트를 반환하도록 작성하겠습니다.

 

텔레그램 봇 만들기

우선 텔레그램 봇을 만들겠습니다. 텔레그램을 열고 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)가 설치된  주피터 노트북에서 작성되었습니다.