<#파이썬> 네이버뉴스 제목에서 원하는 텍스트만 크롤링 후 뉴스...

<#파이썬> 네이버뉴스 제목에서 원하는 텍스트만 크롤링 후 뉴스...

작성일 2022.04.17댓글 1건
    게시물 수정 , 삭제는 로그인 필요

<#파이썬> 네이버뉴스 제목에서  원하는 텍스트만 크롤링 후 뉴스제목,url을 텔레그램 봇 전송을 하기 위해서 여러 고수님들이 공개해주신 코드를 가지고 공부했으나 미천한 실력으로 진행이 안되고 있습니다. 제발 도와주세요. 주식하는데 필요한 기사를 실시간 전송이 필요합니다.


붙임 코드 중 안되는 부분과 제가 필요한 부분을 말씀드리겠습니다.


1. 현재상황

   search word(검색어)를 본문에서 검색하여 봇에 전송까지는 성공했지만,

     가. 본문에서 검색어를 검색하기에 너무 광범위해지는 문제점 발생

     나. 며칠 전 기사도 포함되어 검색되는 문제점 발생

     다. 텔레그램봇으로 전송은 되나 제목이 아니라 링크가 전송되어 직관성이 떨어지는 문제점 발생

     라. 검색어를 추가할 때 계속 코드변경을 수정해야 하는 문제점 발생


2. 해결을 위한 고민 

     가. 본문이 아니라 제목에 검색어가 포함된 기사만 크롤링

     나. 실시간 대응을 위하여 1분(심지어 실시간) 이내의 기사만 전송

     다. 텔레그램 봇으로 전송시 기사 제목을 전송(텔레그램 확인 시 url, 기사 앞부분 등 표시 및 클릭시 기사페이지로 이동

     라. 텔레그램에서 검색어 추가 및 삭제기능 탑제


제 컴퓨터는 거의 24시간 켜져있다고 보시면 됩니다.  고수님들의 도움이 절실합니다~



profile_image 익명 작성일 -

import requests from bs4 import BeautifulSoup as bs import telegram import time import re #step2.새로운 뉴스 기사 링크를 받아오는 함수 def get_new_links(old_links=[]): # (주의) 에서 키워드 검색 - 뉴스 탭 클릭 - 최신순 클릭 상태의 url url = 'https://search.naver.com/search.naver?where=news&query={search_word}&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 # pip install lxml # html.parser 보다 lxml 이 빠릅니다. pip 로 설치후 사용 def get_new_links_ex(search_word, old_links=[]): url = f'https://search.naver.com/search.naver?where=news&query={search_word}&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' response = requests.get(url) soup = bs(response.text , 'lxml') news_list = soup.select("ul.list_news > li.bx") for ns in news_list: area = ns.select_one("div.news_area") _time = area.select_one("div.news_info > div.info_group > span").text # 최소 시간단위가 '분' 이 아니면 통과 if _time.find("분 전") < 0: continue _news = area.select_one("a.news_tit") _title = _news.text if _news is not None else "" # 제목에 검색어가 없으면 통과 if _title.find(search_word) < 0: continue _link = _news.get("href") if _news is not None else "" # 이전 기사 목록에 존재하면 통과 if _link in old_links: continue # 이전 기사 목록에 존재하지 않으면 이전 목록에 저장 old_links.append(_link) _sec = int(_time.replace("분 전", "").strip()) * 60 _desc = area.select_one("div.news_dsc > div > a") _summary = _desc.text if _desc is not None else "" _group = area.select_one("div.news_info > div.info_group > a") _group.select_one("span").decompose() _source = _group.text _title = _title.replace("<", "&#60;").replace(">", "&#62;") _summary = _summary.replace("<", "&#60;").replace(">", "&#62;") _summary = _summary.replace(search_word, f"<code>{search_word}</code>") print(_title, _source, _sec, _link, _summary) output = f"<a href='{_link}'>{_title}</a> <i>{_source}</i>\n" output += f"<code>{_summary}</code>" bot.send_message(chat_id="546817595", text=output, parse_mode="HTML", disable_web_page_preview=True) if __name__ == "__main__": bot_token ='....... 토큰.......' bot = telegram.Bot(token = bot_token) get_new_links_ex("삼성")

일단 기존코드에서 제 컴퓨터에서 테스트 가능하게 스케쥴 라이브러리를 사용하지 않고 작성한 코드 입니다.

get_new_links_ex() 함수를 보시면 될듯 합니다. 시간체크, 제목체크 하는 부분이 추가되었고 기존 리스트 처리 방식이 변경되었습니다.

실행해보면 위 이미지처럼 출력됩니다. 제목을 클릭하면 링크로 이동하게 되어있습니다.

라. 텔레그램에서 검색어 추가 및 삭제기능 탑제

말씀하신 이 기능은 어느정도 코드가 있다면 모르겠으나 지금 코드에서 이 기능을 구현하려면 현재 프로그램을 새로 다 작성해야 할 내용이기에 생략되었습니다. 이론적으로만 얘기하면,

봇이 풀링하면서 특정 메세지를 입력받을 수 있게 처리 해야 하는데 지금 구조상으로는 스케쥴 동작과 구조상 충돌하게 됩니다. 스케쥴 처리를 쓰레드 처리 하던가 하셔야 할듯 합니다.

추가 질문사항이 있으시면 1:1 질문으로 주시기 바라며 도움되셨다면 답변확정 부탁드립니다.

네이버뉴스 파이썬 크롤링 질문

아래 조건으로 네이버뉴스파이썬으로 크롤링하고 싶은데... 결과값: 뉴스 제목과 링크 아래와 같이 코드를 입력했는데 'Process...