Telegram

**Тихий кошмар разработчика: Парсинг государственных сайтов и вечная битва с обновлениями**

**Тихий кошмар разработчика: Парсинг государственных сайтов и вечная битва с обновлениями**
В продолжении [предыдущего поста касаемо парсинга](https://t.me/daniilak/1437)

__В эпоху цифровизации государственные данные — это новый вид нефти. Кто владеет информацией, тот владеет миром. Но добыча этой «нефти» из официальных источников превращается для разработчиков в сизифов труд, полный непредсказуемости, боли и бесконечных доработок__

Представьте, что вы пытаетесь собрать сложный конструктор без инструкции. Теперь представьте, что детали в коробке постоянно меняют форму. Это и есть парсинг госсайтов. Отсутствие API — это правило, а не исключение. Вместо четких, структурированных JSON-ответов разработчикам приходится иметь дело с HTML-страницами, которые были спроектированы для людей, а не для машин. Логика отображения данных часто архаична, нелогична и разбросана по десяткам скриптов и стилей.

Ключевые сложности:
— Вы встречаете вложенные таблицы с бессмысленными классами вроде style45 или block1.
— Защита от «вредоносных ботов» часто не отличает легитимного робота, собирающего открытые данные, от злоумышленника
— Для доступа к данным часто требуется поддерживать сессию, имитировать поведение браузера и проходить многоэтапный логин с токенами, которые прячутся в скрытых полях форм

Если бы структура сайта была статичной, проблему можно было бы решить раз и навсегда. Но госсайты живут своей жизнью. Классы, идентификаторы, структура DOM-дерева - всё это меняется без предупреждения. Селектор, который идеально работал вчера, сегодня возвращает null. Появление динамических элементов через JavaScript (например, подгрузка данных через AJAX), смена механизмов пагинации, обновление фронтенд-фреймворка — всё это ломает ваши тщательно выверенные скрипты. Названия полей, форматы данных, обязательные заголовки (User-Agent, Referer) — всё это подвижно

Самое коварное в этой системе — иллюзия контроля. Вы построили мониторинг, который поймал ошибку на одном из ключевых URL. Вы исправляете селектор, деплоите фикс и вздыхаете с облегчением. Но это — лишь верхушка айсберга. **Закон парсинга: если отловлена одна ошибка, вероятно, есть еще добрая сотня похожих**. Скрипт может корректно обрабатывать 95% случаев, но ломаться на специфических данных (отсутствующее поле, особый формат ФИО, устаревшая запись), которые встречаются редко. Парсер может не выбросить исключение, а просто пропустить часть данных. Такие ошибки обнаруживаются только при глубоком анализе выгрузки, а не в логах


**Бороться с этой стихией в лоб бесполезно. Нужна правильная архитектура**, которая предполагает постоянные изменения.

1. Не полагайтесь на один селектор. Создавайте цепочки приоритетов: «если не нашел по селектору А, ищи по селектору Б, затем по В».
2. Вынесите селекторы, URL, параметры запросов в конфигурационные файлы (JSON, YAML). Это позволит вносить срочные правки без перекомпиляции и деплоя всего сервиса.
3. Используйте многоуровневый мониторинг. Отслеживание HTTP-статусов, таймаутов, исключений в коде. Полный контроль объема собранных данных. Валидация собранных данных на соответствие ожидаемым схемам, например, с помощью JSON Schema/Pydantic и т.п.
4. Не экономьте на буквах в логах. В логах должны быть не только ошибки, но и контекст: какой URL обрабатывался, какие данные были получены на каждом этапе. В каких-то случаях помогут даже скриншоты
5. Запускайте периодически глубокую проверку всех ключевых эндпоинтов, чтобы находить «тихие» ошибки

Это часть из техник — лишь попытка построить стабильный дом на зыбучих песках. Корень проблемы глубже — в самой философии разработки таких систем. Со стороны государственных структур нет понимания, что их сайты — это не только витрина для граждан, но и потенциальный источник машинно-читаемых данных. **Разработчики этих порталов работают в парадигме «работает же — не трожь», где любая инициатива по стандартизации или созданию API наказывается знаменитой фразой «инициатива наказуема»**. Отсутствие внятной документации заменяется 150-страничным PDF, сделанным в Ворде, который устаревает раньше, чем его успевают прочитать

#парсинг@daniilak