Skip to content

kristal374/HDrezkaCrawler

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

HDrezkaCrawler

Python License SQLAlchemy SQLite MongoDB Tor

Краулер для автоматического сбора данных с сайта 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 (если он был создан при предыдущем аварийном завершении).

После этого автоматически запускается полный цикл парсинга.

Порядок парсинга

Краулер последовательно обходит следующие сущности:

  1. Тайтлы — все страницы каждой категории (главная, фильмы, сериалы, мультфильмы, аниме, новинки, анонсы)
  2. Коллекции — список коллекций и их наполнение
  3. Франшизы — список франшиз и их состав
  4. Вопросы — раздел Q&A
  5. Потерянные тайтлы — тайтлы из XML-карт сайта, отсутствующие в базе
  6. Персоны — детальные страницы актёров и режиссёров

Архитектура проекта

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.

About

Python-краулер для полного обхода сайта rezka.ag: собирает подробные данные о тайтлах, персонах, франшизах и коллекциях и сохраняет их в локальную SQLite-базу через SQLAlchemy.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages