Telegram бот-парсер (Python + aiogram3)
Пишу бота-парсера (в учебных целях).
По команде /start он парсит последние N статей с хабра и присылает сообщением. Вопросы:
- Результат парсинга я записываю в str, это адекватно? Я не придумал как это хранить. Словарь?
- Нарушены ли где-то принципы асинхронности?
- Чтобы бот парсил раз в час, достаточно ли обернуть внутрянку функции start_command(message: Message) в цикл и добавить sleep? Это вообще правильно?
- Как сделать так, чтобы новый парсинг не включал результаты предыдущего? Я так полагаю изначально надо результат хранить по другому (например, словарь), чтобы была возможность сравнивать по заголовкам. Так?
- Вообще любую фильтрацию лучше делать в процессе парсинга или в процессе склеивания ответа?
- Как хранить токен, если я запускаю код в google collab?
- Код:
import aiogram
import asyncio
from aiogram.filters import Command
from aiogram.types import Message
from aiogram import Dispatcher, Bot, Router
from bs4 import BeautifulSoup
import requests
TOKEN = 'Здравствуйте'
bot = Bot(token=TOKEN)
dp = Dispatcher()
router = Router()
@router.message(Command("start"))
async def start_command(message: Message):
await message.answer('Last N articles:')
html = requests.get('https://habr.com/ru/articles/').text
soup = BeautifulSoup(html, 'html.parser')
find_limit = 10
articles = soup.find_all('article', class_='tm-articles-list__item', limit=find_limit)
msg = ''
for i, article in enumerate(articles, start=1):
link = article.find('a', class_='tm-title__link')
date = article.find('a', class_='tm-article-datetime-published').find('time')
msg += f'{i}: {link.text}\n'
msg += 'https://habr.com' + link.get('href') + '\n'
article_datetime = date.get('title')[-5:]
msg += f'Время публикации: {article_datetime}\n'
await message.answer(msg)
dp.include_router(router)
await dp.start_polling(bot)```