Files
CourseWork_IRFM/instructions/LOADER_README.md
T
Dmitry 0b41577a42 Add loader and processor modules with documentation and output files
- 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.
2026-04-16 21:38:00 +03:00

128 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## Как работает loader
Loader находится в `modules/loader.py`. Его задача одна: скачать HTML-страницу и вернуть ее как строку.
Есть загрузка через `curl`, загрузка через `urllib` и общая функция `download_html()`, которая выбирает порядок попыток.
## Заголовки запроса
В начале файла задан словарь:
```python
HEADERS
```
Он содержит HTTP-заголовки:
```text
User-Agent
Accept
Accept-Language
```
Они нужны, чтобы сайт отдавал обычную HTML-страницу, как браузеру.
## Загрузка через curl
Функция:
```python
download_with_curl(url, timeout)
```
запускает системную команду `curl` через `subprocess.run`.
Используются параметры:
```text
-L переходить по редиректам
--compressed принимать сжатый ответ
--silent не печатать лишний прогресс
--show-error показать ошибку, если она есть
--max-time ограничить время загрузки
-A передать User-Agent
```
Если `curl` что-то скачал в `stdout`, функция декодирует байты как UTF-8 и возвращает HTML-строку.
Для ConsultantPlus этот способ оказался надежнее, чем чистый `urllib`, потому что сайт иногда нестабильно отдает большие страницы.
## Загрузка через urllib
Функция:
```python
download_with_urllib(url, timeout)
```
использует стандартную библиотеку Python:
```python
urllib.request
```
Алгоритм:
1. Создается SSL-контекст.
2. Создается `Request` с заголовками `HEADERS`.
3. Вызывается `urlopen`.
4. Ответ читается и декодируется как UTF-8.
SSL-проверка отключена:
```python
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE
```
Это сделано для учебной устойчивости загрузки, чтобы сертификаты сайта не мешали выполнению задания.
## Главная функция
Основная функция модуля:
```python
download_html(url, retries=3, timeout=30.0)
```
Она возвращает HTML-код страницы.
Логика выбора загрузчика:
- если домен заканчивается на `consultant.ru`, сначала пробуется `curl`, затем `urllib`;
- для остальных сайтов сначала пробуется `urllib`, затем `curl`.
Это задается строкой:
```python
is_consultant = urlparse(url).netloc.endswith("consultant.ru")
```
## Повторные попытки
В `download_html()` есть цикл:
```python
for _ in range(retries):
```
На каждой попытке функция пробует все доступные загрузчики. Если оба способа не сработали, программа ждет `0.5` секунды и пробует еще раз.
Если после всех попыток страница не загрузилась, выбрасывается ошибка:
```python
RuntimeError
```
Эту ошибку затем обрабатывает crawler.
## Где используется loader
Crawler вызывает loader через функцию:
```python
download_html(url, retries=1, timeout=timeout)
```
То есть loader ничего не знает про УК РФ, статьи или обработку текста. Он только скачивает HTML, а вся логика обхода находится в `modules/crawler.py`.