Краулер для автоматического сбора данных с сайта HDrezka — одного из крупнейших русскоязычных видеохостингов фильмов и сериалов. Проект построен поверх библиотеки hdrezka-api и сохраняет собранные данные в SQLite-базу через SQLAlchemy.
- Обход всех разделов сайта: фильмы, сериалы, мультфильмы, аниме, новинки, анонсы
- Парсинг подробных страниц каждого тайтла: описание, жанры, страны, возрастные ограничения, рейтинги, трейлеры, переводы, эпизоды
- Сбор данных о коллекциях, франшизах, вопросах и персонах (актёры, режиссёры и т.д.)
- Обнаружение «потерянных» тайтлов через XML-карты сайта
- Кеширование HTTP-ответов в MongoDB — позволяет избежать повторных запросов при перезапуске
- Автоматическая ротация IP через Tor при блокировке сессии
- Rate limiting (2 запроса/сек), экспоненциальные retry-попытки (до 15 раз)
- Случайные User-Agent заголовки через
fake-useragent - Пакетная запись в БД (CHUNK_SIZE = 36) с поддержкой продолжения после сбоя
- Сохранение состояния парсинга в JSON-дамп при аварийном завершении и восстановление из него
- Структурированное логирование через Loguru (ротация по 2 МБ, хранение ошибок 30 дней)
- Windows-уведомление через Toast при возникновении ошибки
- Python ≥ 3.10
- Tor (запущен на порту 9150 для SOCKS5-прокси, порт 9051 для управления через ControlPort)
- MongoDB (запущена локально на
mongodb://localhost:27017/) - uv (рекомендуемый менеджер пакетов)
# Клонировать репозиторий
git clone https://github.com/kristal374/HDrezkaCrawler.git
cd HDrezkaCrawler
# Установить зависимости через uv
uv syncСоздайте файл .env в корне проекта:
DB_NAME=hdrezkaЭто имя файла SQLite-базы данных (hdrezka.sqlite3), которая создаётся внутри директории пакета.
Параметры парсинга (смещения страниц, размер пакета) задаются в классе ParseSettings в config.py и автоматически
обновляются в ходе работы краулера.
uv run -m HDrezkaCrawlerПри запуске краулер предложит два интерактивных вопроса:
[?] Drop all database table (Y/n):
Ответ Y очистит и пересоздаст все таблицы в базе данных.
[?] Recovery config (Y/n):
Ответ Y восстановит состояние парсинга из файла dump_recovering.json (если он был создан при предыдущем аварийном
завершении).
После этого автоматически запускается полный цикл парсинга.
Краулер последовательно обходит следующие сущности:
- Тайтлы — все страницы каждой категории (главная, фильмы, сериалы, мультфильмы, аниме, новинки, анонсы)
- Коллекции — список коллекций и их наполнение
- Франшизы — список франшиз и их состав
- Вопросы — раздел Q&A
- Потерянные тайтлы — тайтлы из XML-карт сайта, отсутствующие в базе
- Персоны — детальные страницы актёров и режиссёров
HDrezkaCrawler/
├── __main__.py # Точка входа, инициализация логгера и запуск
├── config.py # Переменные окружения, пути, ParseSettings
├── database.py # SQLAlchemy engine и session factory
├── custom_connector.py # HTTP-коннектор с Tor, rate limit, MongoDB-кешем
├── models/* # ORM-модели SQLAlchemy
├── parsers/* # Логика обхода страниц
└── storage/* # Преобразование API-объектов в ORM-модели
MyConnector расширяет базовый Connector из hdrezka-api и добавляет:
- MongoDB-кеш (
use_mongodb): каждый запрос хешируется по URL + параметрам; при повторном запросе ответ берётся из базы без обращения к сети - Rate limiting (
ratelimit): не более 2 запросов в секунду - Автоматические повторы (
tenacity): до 15 попыток с экспоненциальной выдержкой при сетевых ошибках - Ротация IP (
stem): при трёх последовательных неуспешных запросах краулер меняет Tor-узел черезNEWNYM-сигнал и открывает новую сессию - Пауза после каждых 500 запросов (60 секунд) для снижения нагрузки
Проект распространяется под лицензией GPL-3.0.