실시간 급상승 검색어를 정해진 시간마다 크롤링해 텔레그램 메시지로 보내주는 봇을 제작합니다. (흰색 말풍선이 봇이 보낸 거고 녹색 말풍선은 접니다)
이 프로젝트는 아래 과업으로 이루어집니다:
텔레그램 봇 API 접근 권한 얻기
실시간 급상승 검색어 크롤링해 텍스트 파일로 저장
웹크롤링과 메시지 발송을 수행하는 텔레그램 봇 만들기(현재 글)
이번 포스팅에서는
1) 봇이 실급검 사이트 접속해 검색어를 스크래핑(크롤링)하고
2) 그걸 발화 가능한 형식으로 바꿔서
3) 이용자에게 텔레그램으로 발송하는 일련의 과정을 구현합니다.
작업환경
1) 파이썬3.9(64bit)
2) 파이썬IDE : Pycharm
코드
▼ 필요한 라이브러리를 불러옵니다. 불러오려면 당연히 설치가 되어 있어야 되겠죠? (pip install 패키지명)
import telegram
from selenium import webdriver
from selenium.webdriver.common.by import By
import asyncio
▼ Selenium 라이브러리로 실급검 사이트에 접속해서 원하는 정보를 스크래핑하는 코드입니다. 서두에 링크해둔 <실시간 급상승 검색어 크롤링해 텍스트 파일로 저장> 글에 코드에 대한 자세한 주석을 달아두었습니다. 이해가 어려우신 분들은 참고하세요.
# Set up the Chrome driver
driver = webdriver.Chrome()
# Navigate to the webpage
URL = "https://signal.bz/"
driver.get(url=URL)
crawling_date = driver.find_element(by=By.CSS_SELECTOR
, value='#app > div > main > div > section > div > section > section:nth-child(2) > div:nth-child(1) > div:nth-child(1) > span').text
data = [crawling_date, '']
for j in [x for x in range(1, 3)]:
for i in [x for x in range(1, 11)]:
CSS_SELECTOR = f"#app > div > main > div > section > div > section > section:nth-child(2) > div:nth-child(2) > div > div:nth-child({j}) > div:nth-child({i}) > a > span.rank-text"
# Use find_elements to get a list of WebElements
results = driver.find_elements(by=By.CSS_SELECTOR, value=CSS_SELECTOR)
for result in results:
print(result.text)
data.append(result.text)
driver.quit()
with open('realtime_keywords.txt', 'w') as f:
for item in data:
f.write(item + '\n')
▲ 위의 코드를 실행하면 realtime_keywords.txt라는 이름의 텍스트 파일이 생성됩니다. 바로 복사 붙여넣기 해서 메시지로 보내도 괜찮을 만큼 깔끔한 형식으로 실급검 키워드들이 정리되어 있지요.
▼ 마지막 코드뭉치(code snippet)는 크롤링한 실급검 정보를 텔레그램 메시지로 발송하는 작업입니다.
이 코드에 대해서는 서두에 링크해둔 <텔레그램 봇 API 접근 권한 얻기>에서 자세히 설명하고 있습니다. 참고해주세요.
아래 CHAT_IDs 리스트(list)에는 두 개의 텔레그램 user ID가 요소로 있는데요. 하나는 제 것이고, 하나는 지인의 것입니다. 즉, 실급검 알람 메시지를 이 두 사람에게 발송하겠다는 거지요.
async def main():
# Replace 'TOKEN' with your actual bot's API token
TOKEN = '여러분이 발급 받은 API KEY'
bot = telegram.Bot(token=TOKEN)
# Replace 'CHAT_ID' with the chat ID of the recipient (user or group)
CHAT_IDs = ['메시지 수신할 user ID 1', '메시지 수신할 user ID 2']
# 크롤링한 텍스트 파일을 열어 문자열 변수 content에 할당
with open('realtime_keywords.txt', 'r') as file:
content = file.read()
# The message you want to send
MESSAGE = content
# Send the message using 'await'
for CHAT_ID in CHAT_IDs:
await bot.send_message(chat_id=CHAT_ID, text=MESSAGE)
# Run the coroutine
import asyncio
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
realtime_keywords.txt 파일만 이상 없다면, 위 코드 실행 시 메시지가 잘 발송될 겁니다.
▼ 아래는 위의 코드를 합치기만 한, 최종 코드입니다.
import telegram
from selenium import webdriver
from selenium.webdriver.common.by import By
# from webdriver_manager.chrome import ChromeDriverManager
# Set up the Chrome driver
driver = webdriver.Chrome()
# Navigate to the webpage
URL = "https://signal.bz/"
driver.get(url=URL)
crawling_date = driver.find_element(by=By.CSS_SELECTOR
, value='#app > div > main > div > section > div > section > section:nth-child(2) > div:nth-child(1) > div:nth-child(1) > span').text
data = [crawling_date, '']
for j in [x for x in range(1, 3)]:
for i in [x for x in range(1, 11)]:
CSS_SELECTOR = f"#app > div > main > div > section > div > section > section:nth-child(2) > div:nth-child(2) > div > div:nth-child({j}) > div:nth-child({i}) > a > span.rank-text"
# Use find_elements to get a list of WebElements
results = driver.find_elements(by=By.CSS_SELECTOR, value=CSS_SELECTOR)
for result in results:
print(result.text)
data.append(result.text)
driver.quit()
with open('realtime_keywords.txt', 'w') as f:
for item in data:
f.write(item + '\n')
async def main():
# Replace 'TOKEN' with your actual bot's API token
TOKEN = '여러분이 발급 받은 API KEY'
bot = telegram.Bot(token=TOKEN)
# Replace 'CHAT_ID' with the chat ID of the recipient (user or group)
CHAT_IDs = ['메시지 수신할 user ID 1', '메시지 수신할 user ID 2']
# 크롤링한 텍스트 파일을 열어 문자열 변수 content에 할당
with open('realtime_keywords.txt', 'r') as file:
content = file.read()
# The message you want to send
MESSAGE = content
# Send the message using 'await'
for CHAT_ID in CHAT_IDs:
await bot.send_message(chat_id=CHAT_ID, text=MESSAGE)
# Run the coroutine
import asyncio
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
'Programming > Code Archive' 카테고리의 다른 글
[파이썬] 실시간급상승검색어 자동 발송하는 봇 만들기 2: 실급검 크롤링 (0) | 2023.08.13 |
---|---|
[파이썬] 실시간급상승검색어 자동 발송하는 봇 만들기 1: 텔레그램 봇 생성 (0) | 2023.08.13 |
[파이썬] 인스타그램 해쉬태그(#) 검색결과 크롤링하기_최신ver. (19) | 2022.08.13 |
[파이썬-오픈API] 한국은행 경제통계지표 추출 (0) | 2022.07.02 |
[파이썬] 개편된 구글 플레이 스토어! 앱 리뷰 크롤링 (14) | 2022.06.21 |
댓글