Популярные в последнее время слухи о блокировке торрент-трекеров (или уже не слухи?) побудили меня написать свой парсер для сайта rutracker.org. В данной статье я опишу опции для скрипта, выходные данные. Также прилагается просмотрщик с возможность поиска по категориям, и база раздач с описаниями от 16.01.2016.
Зачем?
- На момент начала работы над скриптом, rutracker еще не выкладывал свою базу.
- В данной базе присутствуют описания раздач.
- Похожая статья была на хабре в 2013 году, но к сожалению, данная база ни разу не обновилась после публикации, а последнее обновление репозитория было 16.01.2014 года.
- Это мое первое большое приложение на python, что позволило познакомиться со множеством интересных возможностей языка, начиная от распараллеливания задач и заканчивая компиляцией бинарника под windows.
Пример запуска скрипта для зеркалирования сайта
python3 ./loader.py --ids 0000001 5160000 --threads 200 --qsize 25 --resume
Описание параметров
Опция | Описание |
---|---|
--ids 0000001 0001000 | качает раздачи в указанном диапазоне |
--ids_file file_with_ids.txt | берет номера раздач для скачивания из указанного файла |
--ids_ignore old_finish.txt | исключает из закачки раздачи, которых нет в указанном файле (например, можно пропустить те номера, которых не было при прошлой закачке) |
--random | скачивать раздачи в случайном порядке |
--threads 100 | число потоков для скачивания |
--proxy_file proxy.txt | файл с socks5 прокси (по умолчанию — proxy.txt) |
--login_file login.txt | файл с логинами к сайту (по умолчанию — login.txt) |
--resume | продолжить предыдущую закачку (игнорировать раздачи из файла finished.txt) |
вместе с опцией resume выведет количество скачанных/не скачанных раздач и завершает работу программы | |
--folder descriptions | указывает название директории, куда будут сохраняться описания раздач (по умолчанию — descr) |
--qsize 20 | максимальная величина очереди для скачивания (по умолчанию — 30) |
Описания вспомогательных текстовых файлов
Формат файла с логинами к сайту
username1 password1
username2 password2
Примечание: Дата изменения раздачи зависит от часового пояса, установленного в профиле.
Формат файла с прокси
127.0.0.1 8080
127.0.0.1 8081
В процессе работы
Номера скачанных или не существующих раздач записываются в файл finished.txt. Лог выводится параллельно в консоль и в файл log.txt. Cookie пишутся в temp_cookies.txt, для сохранения между сессиями.
Описание результата
В файле table.txt сохраняется информация о раздачах (за исключением описаний). Для каждой раздачи сохраняются (разделитель — t):
- Идентификатор
- Название раздачи
- Размер (в байтах)
- Количество сидов
- Количество пиров
- Хэш
- Количество скачиваний
- Дата создания
- Категория, включая все подкатегории (разделитель – “ | “)
Пример:
4130425 Mark Lutz/Марк Лутц - Изучаем Python, 4-е издание [2011, PDF, RUS] 12799942 390 9 B507A45DA54ED5EED13221B16E2030DF789A235F 46455 28-08-12 11:28 Книги и журналы | Компьютерная литература | Программирование
Описания раздач сохраняются в отдельные файлы в папку descr (или указанную опцией --folder), в поддиректорию по первым трем цифрам номера раздачи.
Например, описание раздачи 04893221 сохранится в descr484893221.
Основные проблемы, которые возникали при создании скрипта
- Ограничения сайта на 1 логин и на 1 IP-адрес, в конечном итоге самое простое решение – одновременно использовать IP и логин только в одном потоке.
- Модуль multiprocessing для создания потока использует системный вызов fork, который копирует текущий процесс. Соответственно, если сначала читаются все конфиги, строится список на закачку, то процесс кушает более 50 Мб памяти и все потомки получаются такими же тяжелыми. Решение – сначала создать пулл процессов, а только затем читать конфиги.
- На разным страницах одна и та же информация о раздаче может быть представлена в немного разных видах в исходном коде. Решение – при появлении ошибок вручную вносил дополнительные варианты в скрипт.
- Работа с сетевым стеком, в особенности, если использовать непроверенные прокси-серверы, может давать кучу всевозможных ошибок. При большом количестве ошибок с одного прокси – он блокируется, если страница получена с ошибкой – она добавляется в конец очереди, для повторной загрузки.
- Множество всевозможных ошибок при написании многопроцессорного приложения. Наиболее действенным методом отладки стало логгирование всего и вся с различными уровнями отображения.
- При создании просмотрщика главной проблемой стал поиск по раздачам. Полнотекстовый поиск в MySQL отказался искать по части слова (только по полному совпадению). Полной перебор слишком долог. Текущий компромисс – список отсортирован по числу сидов, поиск выполняется последовательно, до нахождения заданного количества результатов.
Просмотрщик
Для просмотра сохраненной базы и поиска по раздачам написан просмотрщик с использованием PyQt5. Для работы необходим файл table_sorted.tar.bz2, который содержит текстовый файл table_sorted.txt (table.txt, отсортированный по число сидов). Для конвертации можно использовать данный скрипт.
Также (опционально) можно положить рядом со скриптом директорию descr, в которой будут лежать заархивированные описания раздач. Я паковал этим скриптом.
Пример структуры директорий и архивов:
descr/000/00000.tar.bz2 descr/000/00001.tar.bz2 … descr/000/00099.tar.bz2 descr/001/00100.tar.bz2 descr/001/00101.tar.bz2 … descr/001/00199.tar.bz2 …
Внешний вид просмотрщика показан на КДПВ.
Опции для поиска
- Минус перед словом для исключения раздач с ним из выдачи.
- limit:5 для задания ограничения результатов, после нахождения которых прекращается поиск (по умолчанию – 20).
- В правом поле можно ввести слова для поиска в наименовании категории.
Двойной клик по хэшу копирует магнет-ссылку с ним в буфер обмена.
Требования
python3-pyqt5, python3-pyqt5.qtwebkit
Установка
Скрипт для python3.
Скомпилированный бинарник для Windows: Mega.nz (30 Мб) (включая все необходимые библиотеки).
База по состоянию на 16.01.2016
Файл с основной информацией о раздачах, отсортированный по количеству сидов: Mega.nz (118 Мб).
Описания раздач (распаковать в папку с просмотрщиком): Mega.nz (2.06 Гб).
Любая критика по коду приветствуется.
В дальнейшем есть задумка добавить в просмотрщик поддержку libtorrent и получить возможность просматривать содержимое раздач/стримить их в проигрыватель.
Также у меня есть сохраненная база от июня 2014 года (без категорий) и от июля 2015 года (с категориями), если есть пожелания, могу посчитать какую-нибудь статистику по изменениям между этими срезами.
Исходники скриптов выложены на github.
Автор: strayge