- Implemented loader in `modules/loader.py` to download HTML pages using curl and urllib. - Created processor in `modules/processor.py` for processing the text of the Russian Criminal Code (УК РФ). - Added README files for both loader and processor explaining their functionality and usage. - Generated output files including original text, prepared text, and subject index in CSV and JSON formats.
4.0 KiB
Как работает loader
Loader находится в modules/loader.py. Его задача одна: скачать HTML-страницу и вернуть ее как строку.
Есть загрузка через curl, загрузка через urllib и общая функция download_html(), которая выбирает порядок попыток.
Заголовки запроса
В начале файла задан словарь:
HEADERS
Он содержит HTTP-заголовки:
User-Agent
Accept
Accept-Language
Они нужны, чтобы сайт отдавал обычную HTML-страницу, как браузеру.
Загрузка через curl
Функция:
download_with_curl(url, timeout)
запускает системную команду curl через subprocess.run.
Используются параметры:
-L переходить по редиректам
--compressed принимать сжатый ответ
--silent не печатать лишний прогресс
--show-error показать ошибку, если она есть
--max-time ограничить время загрузки
-A передать User-Agent
Если curl что-то скачал в stdout, функция декодирует байты как UTF-8 и возвращает HTML-строку.
Для ConsultantPlus этот способ оказался надежнее, чем чистый urllib, потому что сайт иногда нестабильно отдает большие страницы.
Загрузка через urllib
Функция:
download_with_urllib(url, timeout)
использует стандартную библиотеку Python:
urllib.request
Алгоритм:
- Создается SSL-контекст.
- Создается
Requestс заголовкамиHEADERS. - Вызывается
urlopen. - Ответ читается и декодируется как UTF-8.
SSL-проверка отключена:
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE
Это сделано для учебной устойчивости загрузки, чтобы сертификаты сайта не мешали выполнению задания.
Главная функция
Основная функция модуля:
download_html(url, retries=3, timeout=30.0)
Она возвращает HTML-код страницы.
Логика выбора загрузчика:
- если домен заканчивается на
consultant.ru, сначала пробуетсяcurl, затемurllib; - для остальных сайтов сначала пробуется
urllib, затемcurl.
Это задается строкой:
is_consultant = urlparse(url).netloc.endswith("consultant.ru")
Повторные попытки
В download_html() есть цикл:
for _ in range(retries):
На каждой попытке функция пробует все доступные загрузчики. Если оба способа не сработали, программа ждет 0.5 секунды и пробует еще раз.
Если после всех попыток страница не загрузилась, выбрасывается ошибка:
RuntimeError
Эту ошибку затем обрабатывает crawler.
Где используется loader
Crawler вызывает loader через функцию:
download_html(url, retries=1, timeout=timeout)
То есть loader ничего не знает про УК РФ, статьи или обработку текста. Он только скачивает HTML, а вся логика обхода находится в modules/crawler.py.