본문 바로가기

카테고리 없음

파이썬으로 뉴스 알림 텔레그램 봇 만들기(1): 뉴스 링크 수집하기

특정 업무나 투자 활동을 하는 경우 뉴스를 지속적으로 확인해야 하는 일들이 있습니다. 예를 들어 회사에서 IR, PR 업무를 담당하는 경우가 해당합니다. 또는 특정 주식 종목 등의 뉴스를 체크할 수도 있겠네요.

 

이번부터 세 차례에 걸쳐서 내가 원하는 특정 검색어를 기준으로 모바일 네이버 뉴스를 한 시간마다 푸시해주는 텔레그램 봇을 만드는 방법을 알아보겠습니다. 

 

글 순서

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

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

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

 

사이트 구조 살펴보기

사이트 구조를 살펴보고 원하는 키워드로 뉴스 기사 링크를 수집하는 코드를 작성해 보겠습니다.

웹 스크래핑을 할 때 알아두면 좋은 한 가지 팁
모바일 사이트 버전을 찾아보는 것입니다. 웹 사이트 버전보다 더 나은 HTML 문서 구조를 갖추고 있을 수 있습니다. 때때로 작업하는데 소요되는 시간을 줄이는 좋은 방법입니다.

 

왼쪽은 웹 검색 결과 오른쪽은 모바일 검색 결과입니다. 두 화면의 검색 결과는 동일하지만 HTML 구조는 다릅니다. 네이버의 경우에는 모바일 페이지에서 뉴스 링크를 가져오는 편이 더 간편합니다. 이후 과정에서는 모바일 페이지를 기준으로 진행하겠습니다.

 

 

키워드 검색 결과의 부모 태그인 ul은 news_result_list라는 id가 부여되어있습니다. 이 곳을 시작으로 삼으면 적당할 것 같습니다.

 

 

뉴스 링크 수집하기

원하는 키워드의 뉴스 검색 결과가 담긴 html 문서를 soup 객체로 저장합니다. 이제 이 객체에서 각 뉴스 기사의 링크를 추출할 수 있습니다.

# 라이브러리 불러오기
import requests
from bs4 import BeautifulSoup

# 검색 키워드
search_word = '삼성전자'

# 해당 url의 html문서를 soup 객체로 저장
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')

 

뉴스 링크를 가져오기 위해서는 ul.new_result_list > .bx > .news_wrap > a 의 순서로 내려가면 됩니다. BeaBeautifulSoup에는 CSS Selector를 기준으로 태그를 가져올 수 있는 select라는 함수가 존재합니다.

 

 

select 함수는 결과를 리스트로 반환합니다. a 태그를 잘 가져왔는지 확인하기 위해서 리스트를 순회하며, a 태그를 포함하여 자손 태그에 담긴 문자열을 출력합니다. 아래 결과를 보시면 잘 출력된 것을 확인할 수 있습니다.

 

search_result = soup.select_one('#news_result_list')
news_links = search_result.select('.bx > .news_wrap > a')

for i in news_links:
    print(i.get_text())
    
"""
 삼성전자, 노조가입 독려 이메일 두차례 일괄삭제 '논란' 
 삼성전기, 준법경영 프로그램 CEO직할 조직으로 격상 
 김현석 삼성전자 사장 “미래 준비 박차..‘볼리’ 상품화도 속도”(종합) 
 삼성종기원 연구진, 비침습 혈당 측정 가능성 입증 
 삼성 vs LG, 엇갈린 건조기 실적…"승부는 올해부터" 
 “세탁에서 건조까지 알아서 척척…”삼성, 세탁·건조기 ‘그랑데 AI’ 출격 
 삼성전자, 세계 첫 5G 태블릿 ‘갤럭시 탭 S6’ 출시 
 ‘삼성물산 합병 의혹’ 장충기·김종중 동시에 검찰 조사 
 "세탁·건조 가사노동, AI로 풀었다"...삼성 그랑데 AI 경험 혁신 
 삼성전자, 세계 최초 5G 태블릿PC '갤럭시탭 S6' 출시 
 삼성 제치고 5G폰 1위 차지한 화웨이, 어찌된 일인가 봤더니… 
 삼성, 당뇨병 '30년 난제' 풀었다…"피 안뽑고도 혈당 측정" 
 [포토] 자이언티, 삼성전자 런칭 행사 왔어요 
 김현석 삼성전자 사장 “CES 주인공 볼리, 상품화 속도 낼 것” 
 삼성 준법감시팀, CEO 직속 조직으로 격상 
"""

 

이번에는 링크를 출력해보겠습니다. 문제없이 잘 출력됩니다.

 

for i in news_links:
    print(i['href'])
    
"""
https://m.news.naver.com/read.nhn?mode=LSD&mid=sec&sid1=102&oid=001&aid=0011364544
https://m.news.naver.com/read.nhn?mode=LSD&mid=sec&sid1=101&oid=277&aid=0004614242
https://m.news.naver.com/read.nhn?mode=LSD&mid=sec&sid1=105&oid=018&aid=0004564561
http://www.datanet.co.kr/news/articleView.html?idxno=141976
http://www.enewstoday.co.kr/news/articleView.html?idxno=1364430
https://m.news.naver.com/read.nhn?mode=LSD&mid=sec&sid1=101&oid=016&aid=0001629034
https://m.news.naver.com/read.nhn?mode=LSD&mid=sec&sid1=105&oid=366&aid=0000469538
https://m.news.naver.com/read.nhn?mode=LSD&mid=sec&sid1=102&oid=028&aid=0002483077
https://m.news.naver.com/read.nhn?mode=LSD&mid=sec&sid1=105&oid=092&aid=0002179583
https://m.news.naver.com/read.nhn?mode=LSD&mid=sec&sid1=101&oid=025&aid=0002971095
https://m.news.naver.com/read.nhn?mode=LSD&mid=sec&sid1=105&oid=022&aid=0003434062
https://m.news.naver.com/read.nhn?mode=LSD&mid=sec&sid1=101&oid=001&aid=0011362745
http://m.asiatoday.co.kr/kn/view.php?key=20200129010015636
https://m.news.naver.com/read.nhn?mode=LSD&mid=sec&sid1=105&oid=018&aid=0004564555
https://m.news.naver.com/read.nhn?mode=LSD&mid=sec&sid1=101&oid=015&aid=0004280818
"""

 

다음 시간에는 뉴스 링크를 텔레그램 메시지로 알려주는 알림이 봇을 만들어 보겠습니다. 

 

 

- 이 글은 아나콘다(Anaconda3)가 설치된  주피터 노트북에서 작성되었습니다.