48 lines
7.2 KiB
Markdown
48 lines
7.2 KiB
Markdown
# Исправление чтения KHL.ru — build 2026.09.27.3
|
||
|
||
Обновление включает предыдущие исправления v1–v6, в том числе сравнение игроков, подсказки и дни рождения.
|
||
|
||
## Что обнаружено
|
||
|
||
Прежняя проверка HTML принимала страницу с заголовком `403` за обычную страницу КХЛ. После этого поиск карточек возвращал пустой список, и интерфейс сообщал о возможном изменении разметки. Дефект воспроизведён на ранее сохранённом ответе сайта: документ размером 245 364 символа с заголовком и первым заголовком страницы `403` проходил старую проверку.
|
||
|
||
Сообщение пользователя само по себе не доказывает, что его сервер получил именно эту страницу: без ответа с его сервера нельзя исключить другую разметку списка. Поэтому в обновление включена диагностика фактического ответа.
|
||
|
||
## Исправления
|
||
|
||
- Заголовки ошибок 401/403/429/500/503 и страницы проверки доступа распознаются даже при внешнем HTTP 200. Они не сохраняются в HTML-кэш.
|
||
- При ограничении доступа запросы останавливаются. Другие адреса не используются для обхода ограничения. Старые карточки остаются доступны.
|
||
- Убраны автоматические повторы HTTP 429; обновление не ждёт длительный `Retry-After` внутри HTTP-повтора.
|
||
- HTML декодируется из исходных байтов с учётом его кодировки. Русские имена не зависят от неверного значения ISO-8859-1, которое `requests` может выбрать для `text/html` без указанного charset.
|
||
- Поиск карточек поддерживает относительные ссылки, `data-href`, `data-url` и реальные адреса карточек во встроенном JSON/JSON-LD. Ссылки на чужие домены и произвольные числовые ID не используются.
|
||
- Если получена обычная HTML-страница, но список не распознан, полное обновление может прочитать ранее известные карточки по сохранённым адресам/подтверждённым KHL ID. Результат явно помечается как частичный: новые участники из списка не добавлены. Для операции «текущие судьи» и восстановления имён только по списку этот резерв не применяется.
|
||
- Ошибка разбора одного справочника не прерывает независимое обновление остальных. Настоящее ограничение доступа останавливает все сетевые запросы текущего запуска.
|
||
- Дата данных сохраняется отдельно для каждой карточки. Необновлённые карьерные цифры не получают новую дату только из-за записи общего JSON.
|
||
- Итог обновления сообщает результат по игрокам, тренерам и судьям отдельно.
|
||
|
||
## Диагностика
|
||
|
||
В «Настройки → КХЛ сайт» добавлена кнопка **«Диагностика КХЛ»**. После запуска обновления она скачивает `khl-diagnostics.json` с результатами справочников, последней проблемой, HTTP-статусом, заголовком HTML и определённой кодировкой. Cookies, заголовки авторизации и полный HTML в этот файл не записываются.
|
||
|
||
Если на сервере получается настоящий 403, исправление парсера не снимает ограничение сайта. Проверьте https://www.khl.ru/players/ в браузере на компьютере, где работает сервер проекта. Если сайт и там сообщает об ограничении доступа, вопрос доступа необходимо решить с поддержкой КХЛ. Если браузер открывает список, а программа не обновляет данные, файл диагностики позволит проверить ответ, полученный программой.
|
||
|
||
## Установка
|
||
|
||
1. Остановите сервер проекта.
|
||
2. Распакуйте архив в существующую папку проекта с заменой файлов.
|
||
3. Запустите сервер и обновите страницу.
|
||
4. В «Настройки → КХЛ сайт» нажмите «Игроки» или «KHL.ru: обновить всё».
|
||
5. Если обновление не выполнено, скачайте файл кнопкой «Диагностика КХЛ».
|
||
|
||
Пользовательские настройки, `.env`, базы данных, архив КХЛ и данные Agent в ZIP не включены.
|
||
|
||
## Проверка
|
||
|
||
- 35 целевых проверок прошли: 17 новых сценариев чтения/ошибок/диагностики и 18 прежних проверок КХЛ/карьеры.
|
||
- Полный Python-набор: 462 успешных, 40 прежних неудачных. Набор неудачных тестов совпадает с v6, новых нет.
|
||
- Настоящий сохранённый ответ КХЛ с заголовком `403` теперь отвергается проверкой.
|
||
- В интерфейсе через jsdom проверены список, карточки, обновление, сообщение при отсутствии диагностики и скачивание отчёта; ошибок JavaScript не зарегистрировано.
|
||
- Проверены Python-компиляция, CLI `--help` с установленными зависимостями и синтаксис JavaScript интерфейса.
|
||
|
||
Живая полная загрузка KHL.ru не подтверждена: сайт ответил 403 из среды проверки. Рабочая PostgreSQL пользователя и Windows/vMix в этой итерации не подключались. Проверки поведения выполнялись на локальных тестовых данных.
|