네이버 키워드 뉴스 프로젝트는 네이버 뉴스 탭에서 키워드 로 검색하여 최신 뉴스를 크롤링 하여 텔레그램 방에 정해진 시간에 자동으로 글이 받아 볼 수 있도록 만들 예정입니다.
사실 구글링해서 여러 페이지를 찾아 봤지만 몇가지 오류가 있는 코드도 있었고, 완벽하지 않는 것도 있어 혼란을 겪다가 제가 코드를 수정해서 만들었고 현재 기준으로는 매우 동작이 잘 되는 것을 확인하였습니다.
(2023년 10월 기준) 만약 계속 사용하다가 코드가 업데이트 되었거나 변수가 생기면 해당 포스팅에 업데이트 할 예정입니다. 별도의 글이 업데이트 되지 않았다면 특별한 문제가 확인 되지 않았다고 생각하시면 될 것 같습니다,
먼저 개발 환경은 파이참에서 몇가지 라이브러리를 활용하여 만들었습니다.
파이선에 대한 다른 포스팅을 보고 싶은 분들은 다음 포스팅을 읽어보세요
블로그 키워드 생성 파이썬 코드 Python 마케팅 홍보 키워드에도 좋아요
부동산 파이썬 Python 크롤링 미분양 정보 가져오기 (1편)
라이브러리 – 네이버 키워드 뉴스 텔레그램
사용 라이브러리는 아래와 같습니다.
일반적으로 모든 라이브러리 설치는 거의 비슷합니다. 만약에 라이브러리가 없다고 (대부분 module 에러로 표시 됩니다) 나오면 pip install 라이브러리 형태로 터미널에 입력하면 라이브러리가 자동으로 설치됩니다.
파이참을 다운 받지 않으신 분들은 파이참에 다운 받으시고, 비주얼스튜디오도 무방합니다.
BeautifulSoup
telegram
asyncio
time
개요 – 네이버 키워드 뉴스 텔레그램
코드는 네이버 검색 창에서 검색어 (query)가 정의 되면 뉴스를 최신 순서로 정렬 후 검색어에 해당하는 뉴스를 크롤링하여 본인이 만든 텔레그램 봇을 활용하여 정해진 타임에 따라 스크롤링 글을 자동으로 등록하는 것입니다. 매우 유용하겠지요?
예를 들어, 부동산을 검색어로 정했을 때 부동산 뉴스를 정해진 시간에 따라 크롤링 한 후에 텔레그램 방에 업데이트 시키는 것입니다.
텔레그램 봇을 설정하는 방법과 토큰을 확보하는 방법은 아래 포스트에서 확인하세요. 만약에 텔레그램 봇을 설정하셨거나 토큰 번호를 이미 알고 계신 분들은 패스 하셔도 좋습니다.
세부 코드 (coding) – 네이버 키워드 뉴스 텔레그램
- 모듈 및 패키지 가져오기:
import requests from bs4 import BeautifulSoup as bs import telegram import asyncio import time
requests
: 웹 페이지에서 데이터를 가져오기 위한 모듈입니다.BeautifulSoup
: 웹 페이지에서 데이터를 파싱하기 위한 패키지입니다.telegram
: 텔레그램 봇과 통신하기 위한 패키지입니다.asyncio
: 비동기 작업을 처리하기 위한 모듈입니다.time
: 시간 지연을 위한 모듈입니다.
- 사용할 변수 정의:
old_links = [] bot = None chat_id = '' # 채팅 ID를 여기에 입력하세요.
old_links
: 이전에 전송한 뉴스 링크를 저장하는 리스트입니다.bot
: 텔레그램 봇을 초기화하기 위한 변수입니다.chat_id
: 메시지를 전송할 채팅 ID를 지정합니다.
- 검색어 입력 받기:
query = input('주제: ')
- 사용자로부터 검색할 주제를 입력받습니다.
get_new_links
함수 정의:
async def get_new_links(): 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=&no=so%3Add%2Cp%3Aall&is_sug_officeid=0' response = requests.get(url) soup = bs(response.text, 'html.parser') 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
get_new_links
함수는 입력받은 검색어(query
)에 대한 네이버 뉴스 검색 결과를 크롤링하여 새로운 링크 목록을 반환합니다.
send_links
함수 정의:
async def send_links(): global old_links, bot new_links = await get_new_links() if new_links: for link in new_links await bot.sendMessage(chat_id=chat_id, text=link) time.sleep(3) # 메시지 간에 3초의 지연을 추가 else: pas
send_links
함수는 get_new_links
함수를 통해 얻은 새로운 링크 목록을 텔레그램으로 전송합니다. 메시지를 전송할 때 메시지 간에 3초의 지연을 추가하여 Flood Control 예외를 피합니다.
main
함수 정의
global bot bot_token = '' # 본인의 봇 토큰으로 대체하세요. bot = telegram.Bot(token=bot_token) await bot.sendMessage(chat_id=chat_id, text=f"{query}를 주제로 뉴스 기사 크롤링이 시작되었습니다") while True: await send_links() await asyncio.sleep(30)
- 코드 실행:
if __name__ == '__main__': asyncio.run(main())
- 코드를 실행하면 사용자로부터 주제를 입력받아 해당 주제에 대한 뉴스 링크를 주기적으로 수집하고 텔레그램으로 전송합니다.
이렇게 코드를 단계별로 설명했습니다. 원하는 주제를 입력하고 실행하면 됩니다.
전체 코드 – 네이버 키워드 뉴스 텔레그램
import requests from bs4 import BeautifulSoup as bs import telegram import asyncio import time old_links = [] bot = None chat_id = '' # 채팅 ID를 여기에 입력하세요. # 검색어를 코드 내에서 미리 정의 query = input('주제: ') async def get_new_links(): 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=&ns=so%3Add%2Cp%3Aall&is_sug_officeid=0' response = requests.get(url) soup = bs(response.text, 'html.parser') 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 async def send_links(): global old_links, bot new_links = await get_new_links() if new_links: for link in new_links await bot.sendMessage(chat_id=chat_id, text=link) time.sleep(3) # 메시지 간에 3초의 지연을 추가 else: pass async def main(): global bot bot_token = '' # 본인의 봇 토큰으로 대체하세요. bot = telegram.Bot(token=bot_token) await bot.sendMessage(chat_id=chat_id, text=f"{query}를 주제로 뉴스 기사 크롤링이 시작되었습니다") while True: await send_links() await asyncio.sleep(30) if __name__ == '__main__': asyncio.run(main())
EXE 파일 만들기 – 네이버 키워드 뉴스 텔레그램
Python 스크립트를 실행 가능한 .exe 파일로 변환하려면 pyinstaller
와 같은 패키지를 사용할 수 있습니다. 아래는 파이썬 스크립트를 .exe 파일로 변환하는 단계입니다:
- PyInstaller 설치: 먼저,
pyinstaller
를 설치해야 합니다. 명령 프롬프트나 터미널에서 다음 명령어를 실행하여 설치합니다pip install pyinstaller
- 스크립트 변환: 다음으로, 파이썬 스크립트를 .exe 파일로 변환합니다. 명령 프롬프트나 터미널에서 스크립트가 있는 디렉토리로 이동한 후 다음 명령어를 실행합니다:
pyinstaller --onefile your_script.py
여기서
your_script.py
는 변환하려는 파이썬 스크립트의 이름입니다. - 빌드 디렉토리: 변환 프로세스가 완료되면
dist
디렉토리가 생성됩니다. 이 디렉토리 안에 실행 가능한 .exe 파일이 생성됩니다. 이 파일을 실행하여 스크립트를 실행할 수 있습니다.
이렇게 하면 파이썬 스크립트를 .exe 파일로 변환할 수 있습니다. 변환된 .exe 파일을 실행하면 스크립트를 실행할 수 있습니다.