Оффлайн база rutracker с описаниями раздач и возможость поиска по категориям
Популярные в последнее время слухи о блокировке торрент-трекеров (или уже не слухи?) побудили меня написать свой парсер для сайта 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) --print вместе с опцией 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, для сохранения между сессиями.
Описание результата- Идентификатор
- Название раздачи
- Размер (в байтах)
- Количество сидов
- Количество пиров
- Хэш
- Количество скачиваний
- Дата создания
- Категория, включая все подкатегории (разделитель – “ | “)
4130425 Mark Lutz/Марк Лутц - Изучаем Python, 4-е издание [2011, PDF, RUS] 12799942 390 9 B507A45DA54ED5EED13221B16E2030DF789A235F 46455 28-08-12 11:28 Книги и журналы | Компьютерная литература | Программирование
Описания раздач сохраняются в отдельные файлы в папку descr (или указанную опцией --folder), в поддиректорию по первым трем цифрам номера раздачи.
Например, описание раздачи 04893221 сохранится в descr\048\04893221.
Основные проблемы, которые возникали при создании скрипта
- Ограничения сайта на 1 логин и на 1 IP-адрес, в конечном итоге самое простое решение – одновременно использовать IP и логин только в одном потоке.
- Модуль multiprocessing для создания потока использует системный вызов fork, который копирует текущий процесс. Соответственно, если сначала читаются все конфиги, строится список на закачку, то процесс кушает более 50 Мб памяти и все потомки получаются такими же тяжелыми. Решение – сначала создать пулл процессов, а только затем читать конфиги.
- На разным страницах одна и та же информация о раздаче может быть представлена в немного разных видах в исходном коде. Решение – при появлении ошибок вручную вносил дополнительные варианты в скрипт.
- Работа с сетевым стеком, в особенности, если использовать непроверенные прокси-серверы, может давать кучу всевозможных ошибок. При большом количестве ошибок с одного прокси – он блокируется, если страница получена с ошибкой – она добавляется в конец очереди, для повторной загрузки.
- Множество всевозможных ошибок при написании многопроцессорного приложения. Наиболее действенным методом отладки стало логгирование всего и вся с различными уровнями отображения.
- При создании просмотрщика главной проблемой стал поиск по раздачам. Полнотекстовый поиск в MySQL отказался искать по части слова (только по полному совпадению). Полной перебор слишком долог. Текущий компромисс – список отсортирован по числу сидов, поиск выполняется последовательно, до нахождения заданного количества результатов.
Просмотрщик
Для просмотра сохраненной базы и поиска по раздачам написан просмотрщик с использованием PyQt5. Для работы необходим файл table_sorted.tar.bz2, который содержит текстовый файл table_sorted.txt (table.txt, отсортированный по число сидов). Для конвертации можно использовать данный скрипт.
Также (опционально) можно положить рядом со скриптом директорию descr, в которой будут лежать заархивированные описания раздач. Я паковал этим скриптом.
Пример структуры директорий и архивов:
Внешний вид просмотрщика показан на КДПВ.
Опции для поиска- Минус перед словом для исключения раздач с ним из выдачи.
- limit:5 для задания ограничения результатов, после нахождения которых прекращается поиск (по умолчанию – 20).
- В правом поле можно ввести слова для поиска в наименовании категории.
Двойной клик по хэшу копирует магнет-ссылку с ним в буфер обмена.
Требования УстановкаСкомпилированный бинарник для Windows: Mega.nz (30 Мб) (включая все необходимые библиотеки).
База по состоянию на 16.01.2016
Файл с основной информацией о раздачах, отсортированный по количеству сидов: Mega.nz (118 Мб).
Описания раздач (распаковать в папку с просмотрщиком): Mega.nz (2.06 Гб).
Любая критика по коду приветствуется.
В дальнейшем есть задумка добавить в просмотрщик поддержку libtorrent и получить возможность просматривать содержимое раздач/стримить их в проигрыватель.
Также у меня есть сохраненная база от июня 2014 года (без категорий) и от июля 2015 года (с категориями), если есть пожелания, могу посчитать какую-нибудь статистику по изменениям между этими срезами.