Как написать парсер для извлечения изображений с сайта, используя Aiogram 3?

Как настроить бота для отправки случайных картинок с сайта без необходимости вставки и обновления множества ссылок?
  • 7 февраля 2024 г. 5:39
Ответы на вопрос 1
Aiogram 3 — это асинхронный фреймворк для создания ботов в Telegram, предназначенный для работы с API Telegram. Он не предназначен для парсинга контента из интернета. Для парсинга веб-сайтов и извлечения информации, включая изображения, можно использовать другие инструменты, например, BeautifulSoup или Scrapy в сочетании с библиотекой aiohttp для асинхронных запросов.

Чтобы реализовать бота, который отправляет случайные картинки с сайта, вам надо сделать следующее:

1. Соберите ссылки на изображения с сайта, используя инструменты для парсинга.
2. Сохраните эти ссылки в базу данных или файл.
3. Настройте вашего бота так, чтобы он мог отправлять изображения в чат по запросу.

Примерный код для парсинга изображений с сайта с использованием aiohttp и BeautifulSoup может выглядеть так:

```python
import aiohttp
from bs4 import BeautifulSoup
import random

async def fetch_html(url: str):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.text()

async def parse_images_from_website(url: str):
    html = await fetch_html(url)
    soup = BeautifulSoup(html, 'html.parser')
    images = [img['src'] for img in soup.find_all('img') if 'src' in img.attrs]
    return images

async def main():
    url = 'http://example.com'
    images = await parse_images_from_website(url)
    # Тут вы можете сохранить полученные ссылки на изображения в файл или базу данных
    print(images)

# Помните, что для выполнения асинхронных функций надо использовать event loop
import asyncio
asyncio.run(main())
```

Теперь, чтобы интегрировать это с ботом на Aiogram, давайте создадим базовый пример отправки случайной картинки пользователю:

```python
from aiogram import Bot, Dispatcher, executor, types
from aiogram.types import InputFile

API_TOKEN = 'ВашToken'

# Создаём бота и диспетчера
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)

# Предположим, что у вас уже есть список ссылок на изображения в images_urls
images_urls = ['http://example.com/image1.jpg', 'http://example.com/image2.jpg', ...]

@dp.message_handler(commands=['random_image'])
async def send_random_image(message: types.Message):
    image_url = random.choice(images_urls)  # Выбираем случайную картинку
    async with aiohttp.ClientSession() as session:
        async with session.get(image_url) as resp:
            if resp.status != 200:
                await message.reply("Не удалось получить изображение.")
                return
            data = await resp.read()
            await message.reply_photo(photo=data)

if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)
```

В этом примере у нас есть команда `/random_image`, которая отправляет пользователю случайное изображение из списка `images_urls`. Не забудьте заменить плейсхолдер `API_TOKEN` на реальный токен вашего бота. Также стоит иметь в виду, что хранение всех ссылок на картинки в переменной — не самый масштабируемый и надежный способ. Рекомендуется использовать базу данных для хранения URL-адресов и другой информации.

Необходимо иметь в виду, что множество сайтов имеют защиту от автоматического парсинга, а также могут быть законные проблемы, связанные с авторскими правами при загрузке и распространении изображений. Убедитесь, что
Похожие вопросы