Вся платформа стоит на одном источнике, которым нельзя управлять. Государственный реестр деклараций и сертификатов отдаёт данные так, как сегодня захотел его сервер: вчера по дате находилась тысяча документов, сегодня вдруг десять миллионов; в пятницу прокси работали, в субботу все машины в бане; в декабре сменилась серверная инфраструктура, и парсер замолчал. А клиентская аналитика обязана оставаться полной и свежей — при любой погоде на той стороне. Заказчик сформулировал коротко: парсер — это основа. Этот кейс про то, как держать основу живой, когда источник четыре года подряд меняется, банит и ломается.
Сводка
| Отрасль конечного клиента | Сертификация продукции, B2B-аналитика рынка |
| Конечный клиент | «Аналитика сертификатов» — внутренняя платформа группы компаний |
| Формат сотрудничества | Регулярное сопровождение — ядро платформы, поток реакций на изменения внешнего источника |
| Тип проекта | Парсер российского реестра деклараций и сертификатов (ФСА / Росаккредитация) как исходный движок всей системы |
| Объём работ | Приём легаси-движка, перевод на современную архитектуру, многолетняя поддержка и реакция на инциденты источника |
| Дата проекта | ноябрь 2021 — продолжается, больше четырёх лет |
| Трудозатраты | Ферма парсинга оформлена в составе пакета ТЗ; основной объём идёт через абонентское сопровождение и реакцию на инциденты |
| Команда | Антон Херсун (руководитель проекта; принял парсинг как легаси, разобрал и перевёл на очереди Laravel руками сам), направление поддерживается внутри команды; последние заказы по парсингу частично подхватил разработчик виджетов и парсеров |
| Технологический стек | Laravel 5.5.50 · Laravel Horizon · очереди и задания · Redis · Docker · ClickHouse · собственная система ротации HTTPS-прокси · мини-ферма недорогих российских серверов |
| Сдано | Парсер реестра ФСА на очередях, инкрементальное возобновление с места обрыва, посуточная статистика сбора, авто-реакция на сбои |
Постановка задачи
Платформа живёт на публичных данных российского реестра: декларации соответствия и сертификаты, которые ФСА выкладывает в открытый доступ. Полноценного публичного API нет. Есть веб-выдача по дате: парсер спрашивает у неё «дай все документы за такое-то число» и разбирает ответ постранично. Источник государственный, его поведение никто со стороны не контролирует, и менять это поведение он может в любой день без предупреждения.
К нам этот движок пришёл как чужой код. До команды парсингом занимался сторонний разработчик, и работал он на ручном приводе: что-то собиралось, что-то отваливалось, а понять, где именно встало, было нельзя — нормальной статистики просто не было. В ноябре 2021 года заказчик отказался от прежней схемы и передал парсинг команде целиком. Антон сразу обозначил план: переписать всю систему на полную автоматику и добавить посуточную статистику, сколько и где спарсилось, что не спарсилось, что отвалилось или попало в бан, чтобы реагировать оперативно и быть в курсе. Передавать направление дальше внутри команды стали только после того, как легаси разобрали руками и перевели на единую архитектуру.
Что в этом сложного
Сложность не в том, чтобы разобрать HTML. Сложность в том, что противоположная сторона ведёт себя как живой противник, хотя злого умысла за ней нет. За четыре года реестр успел: начать отдавать «десять миллионов сертификатов» на любой запрос и подвесить этим наши сервисы; закрыться от заграничных прокси; забанить все парсер-машины разом в пятницу вечером; умереть посреди прохода по страницам и тихо недодать половину деклараций; сменить серверную инфраструктуру так, что старый парсер замолчал; и под конец выставить жёсткий лимит выдачи — двадцать страниц на запрос. Каждое из этих изменений по отдельности останавливает сбор, и узнать о нём можно либо по тишине в логах, либо по жалобе аналитика, что данные за неделю не обновились. Поэтому архитектуру строили вокруг одного принципа: способ получения данных можно менять сколько угодно, а накопленная база и схема хранения остаются целыми.
Как мы это сделали
1. Парсер на очередях Laravel под Horizon, а не cron-скрипт.
Логику сбора вынесли в задания Laravel; поверх работает Horizon как менеджер очередей, под ним Redis. Очередь даёт перезапуск задания при падении, пересбор конкретного периода по требованию без ожидания расписания и общую панель вместо разрозненного мониторинга. Когда реестр недодаёт документы, в очередь просто ставится повторный прогон нужного месяца — и видно, как остаток тает от десятков тысяч к нулю.
2. Инкрементальный сбор с возобновлением ровно с места обрыва.
Парсер каждый день забирает документы по одной дате. Сайт-донор регулярно умирает посреди прохода по страницам: после трёх неудачных попыток скрипт останавливается, и если обрыв пришёлся на середину, остаток в базу не попадает. Чтобы это не превращалось в тихую потерю данных, состояние прохода сохраняется, и пересбор подхватывает с прерванного места, а не сканирует диапазон заново. Дыра, через которую утекали декларации, закрылась; нагрузка на источник заодно снизилась.
3. Посуточная статистика сбора как ранний детектор.
С первого дня к парсеру прикручена статистика по дням: сколько документов на сайте, сколько в базе, чего не хватает. Именно она ловит аномалии раньше клиента. Подозрительно ровное и маленькое число деклараций за июль сразу выдало потерю данных; расхождение «в базе столько, на сайте столько» показывает отставание в реальном времени. Без этой панели каждый инцидент источника оборачивался бы неделей слепоты.
4. Собственная ротация HTTPS-прокси плюс мини-ферма дешёвых серверов.
Когда российские ресурсы закрылись от заграничных прокси, европейские каналы отвалились, и парсер с основного сервера пополз еле-еле. Решение собрали из недорогих российских машин: подняли дополнительные серверы по символической цене, настроили на них парсер и распределили нагрузку — заодно разгрузили основной сервер. Поверх работает собственная система ротации HTTPS-прокси с временным исключением забаненных адресов. Она же потом вытащила сбор из самого тяжёлого бана.
5. Ферма парсинга и автоматический переобход.
Осенью 2022 года разрозненные машины свели в единую ферму и оформили её отдельным ТЗ: три VPS, обход блокировок, автоматический перепарсинг после сбоев и детальный мониторинг. Оно шло в одном пакете с соседней задачей, поэтому отдельной цифры по нему в кейсе нет. Смысл фермы простой: бан или падение одной машины больше не останавливает сбор — очередь перераспределяется, переобход запускается сам.
Инциденты и реакция
Главная ценность движка проверяется не в спокойные недели, а в дни, когда источник ломается. Хроника по российскому реестру за четыре года выглядит так.
Апрель 2022. «Десять миллионов сертификатов». Реестр на любой запрос по дате стал отвечать, что нашлось 10 000 000 сертификатов. Парсер верил: шагал по первым страницам, собирал реальные документы, а дальше уходил в бесконечную пустоту искать записи, которых нет. Сервисы от этого сошли с ума, и пользователи перестали входить в систему. Поставили заплатку: проход ограничили первой сотней страниц — на практике этого хватает, чтобы собрать все существующие записи и не блуждать по пустым.
Июнь 2022. Закрытие от заграничных прокси. РФ-ресурсы перестали пускать запросы из-за рубежа, парсер встал. За выходные подняли мини-ферму российских серверов и вернули сбор; за май собрались все сертификаты и декларации, июнь догнали следом.
Июль 2023. Тихая потеря деклараций. Аналитик заметил подозрительно ровное и маленькое число деклараций. Причина — сайт-донор умирает посреди прохода: иногда отдаёт по пятьдесят тысяч деклараций одним разом, а потом падает. С этого началась долгая работа над устойчивостью возобновления.
Декабрь 2023. Бан всех машин. Вечером в пятницу на сервисе деклараций забанили все парсер-машины разом. За выходные систему парсинга переписали в несколько потоков на новой системе прокси: четыре машины, по два потока через прокси на каждой. По декабрю вышли на стопроцентную актуальность — и дальше темп держали уже на новой схеме.
Октябрь 2024. Источник замолчал. Декларации и сертификаты почти неделю не отдавали данные, при этом сайт руками открывался нормально. Антон нашёл изменение на стороне сервера ФСА, отредактировал парсер под него и запустил снова.
Декабрь 2024. Смена инфраструктуры. Реестр сменил серверную инфраструктуру на новую, и старый парсер к ней не адаптировался. Парсер переделали под новый источник; в очередь на пересбор встало 23 тысячи документов.
Март 2026. Лимит двадцать страниц. Реестр ввёл жёсткое ограничение: не больше двадцати страниц по сто документов, то есть тысяча строк на запрос. Старый принцип «забрать всё за дату одним проходом» перестал работать. Собрали новый алгоритм: раз в час перебираем свежие документы до упора в лимит, ловим ошибку конца выдачи, а недостающее добираем вариативным перебором по фильтрам. Пропавшие дни дособрали следом.
Между крупными событиями шла мелкая адаптация. Когда в реестре появилось новое поле «Лицо, принявшее декларацию», его добавили в сбор без переписывания приёмника. А запрос заказчика собирать в сертификатах все технические регламенты вскрыл старую особенность легаси-парсера: из документа он брал лишь первую запись ТР ТС. Пересбор затрагивал порядка 259 тысяч сертификатов, и без отдельного ТЗ от заказчика эта задача осталась в ожидании. В том же режиме живёт план подключения нового реестра REAEC, открытого в 2026 году: план на 13 часов подготовили за день после запроса, старт остался за заказчиком.
Результаты
| Метрика | Значение |
|---|---|
| Роль в системе | Исходный движок платформы; на нём держится вся аналитика по РФ |
| Архитектурный стек | Laravel 5.5.50 · Horizon · Redis · Docker · ClickHouse · собственная ротация HTTPS-прокси · мини-ферма серверов |
| Крупных инцидентов источника отработано | семь за четыре года (бан, смена инфраструктуры, лимит выдачи, аномалии выдачи) и серия мелких адаптаций |
| Скорость реакции на бан (12.2023) | за выходные переписана схема на 4 машины × 2 потока, 100% актуализации декабря |
| Скорость реакции на смену инфраструктуры (12.2024) | парсер переделан, очередь пересбора 23 тыс. документов |
| Реакция на лимит выдачи (03.2026) | новый алгоритм почасового сбора с добором, досбор пропавших дней |
| Календарь работ | ноябрь 2021 → продолжается, больше четырёх лет |
Движок ни разу не переписывался с нуля целиком. Он рос от чужого легаси к сегодняшней архитектуре через цепочку инцидентов, и каждый раз менялась только та часть, что упёрлась в новое поведение источника: то проход по страницам, то транспорт через прокси, то алгоритм обхода лимита. Схема хранения и накопленные за годы данные при этом оставались на месте. Эта же инфраструктура очередей и ротации прокси позже легла в основу парсеров иностранных реестров, но российский движок был первым — и остаётся ядром.
Команда
- Антон Херсун, Xaver Pro, руководитель проекта, архитектурные решения по парсеру, формализация ТЗ. Российский парсинг разбирал руками сам: принял чужой легаси без нормальной статистики и автоматики, изучил, переписал на полную автоматику с посуточным мониторингом и перевёл на очереди Laravel под Horizon с собственной ротацией прокси. Случай для нас редкий, когда руководитель проекта закрывает сборку руками, но передавать спутанный легаси кому-то, не разобрав его лично, было нельзя.
- Разработчик виджетов и парсеров подхватил часть последних заказов по парсингу, когда направление уже стояло на современной архитектуре. Преемственность держится внутри команды: модуль, написанный годы назад, дорабатывает человек изнутри направления, а не «новый человек с нуля».
Скриншоты и материалы
Будут добавлены отдельным проходом. Возможные кандидаты: панель посуточной статистики сбора (документов на сайте против базы), панель очередей Horizon, упрощённая схема задания-парсера с возобновлением прохода.
Если ваш бизнес зависит от одного внешнего источника данных, который вы не контролируете, пришлите описание схемы сбора. Скажем, что в ней сломается первым при бане или смене источника и какая страховка стоит дешевле всего. Смотрим бесплатно.