7.2 KiB
Исправление чтения 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/ в браузере на компьютере, где работает сервер проекта. Если сайт и там сообщает об ограничении доступа, вопрос доступа необходимо решить с поддержкой КХЛ. Если браузер открывает список, а программа не обновляет данные, файл диагностики позволит проверить ответ, полученный программой.
Установка
- Остановите сервер проекта.
- Распакуйте архив в существующую папку проекта с заменой файлов.
- Запустите сервер и обновите страницу.
- В «Настройки → КХЛ сайт» нажмите «Игроки» или «KHL.ru: обновить всё».
- Если обновление не выполнено, скачайте файл кнопкой «Диагностика КХЛ».
Пользовательские настройки, .env, базы данных, архив КХЛ и данные Agent в ZIP не включены.
Проверка
- 35 целевых проверок прошли: 17 новых сценариев чтения/ошибок/диагностики и 18 прежних проверок КХЛ/карьеры.
- Полный Python-набор: 462 успешных, 40 прежних неудачных. Набор неудачных тестов совпадает с v6, новых нет.
- Настоящий сохранённый ответ КХЛ с заголовком
403теперь отвергается проверкой. - В интерфейсе через jsdom проверены список, карточки, обновление, сообщение при отсутствии диагностики и скачивание отчёта; ошибок JavaScript не зарегистрировано.
- Проверены Python-компиляция, CLI
--helpс установленными зависимостями и синтаксис JavaScript интерфейса.
Живая полная загрузка KHL.ru не подтверждена: сайт ответил 403 из среды проверки. Рабочая PostgreSQL пользователя и Windows/vMix в этой итерации не подключались. Проверки поведения выполнялись на локальных тестовых данных.