Комментарии 4
Про блок-лист: добавьте ещё woff, woff2, ttf и eot — шрифты ловятся тем же регексом, если рядом в CSS есть подходящий текст. И .webp с .avif, вы их уже назвали кандидатами — у нас оба встретились быстро.
Самое ценное в статье — про панель, которая переиспользуется между кликами. Это самый противный класс багов: данные валидные, поля заполнены, ошибок нет, а внутри чужой объект. Я делаю сканер составов продуктов, и у нас то же самое вылезло на пользовательских фото: человек снял состав, а запись ушла к соседнему штрихкоду. Лечим точно так же — сверкой, только не заголовка с aria-label, а того, что нашли на фото, с тем, что ожидали.
Про метрики в конце подпишусь обеими руками. У нас лучшим сигналом "парсер поехал" оказалось распределение причин отказа автомодерации, а не сама доля отказов. Когда вчера было поровну, а сегодня одна причина съела всё — значит что-то сломалось выше по конвейеру.
Про шрифты — верно, @2x.woff2 ловится ровно тем же регексом, проглядел. Но раз список расширений пополняется уже третий раз, честнее признать, что блок-лист здесь проигрывающая стратегия: он всегда на шаг позади реальности. Устойчивее проверять не «похоже ли на мусор», а валидность домена — сверять последний сегмент со списком существующих TLD (IANA публикует его текстом, одна строка — один TLD). Тогда png, jpg, webp, avif, woff, woff2, ttf, eot и всё будущее семейство отваливаются одним правилом, потому что доменных зон с такими именами не существует. Дыра там тоже есть, для честности: .zip и .mov — настоящие gTLD с 2023 года, так что archive@2x.zip пройдёт. Но это две штуки в блок-листе вместо бесконечного списка расширений.
Одно дополнение к лечению: я бы не просто сверял ожидаемое с полученным, а считал число расхождений и выводил его в метрику. Обычно это стабильный фон в пару процентов — просто не успело отрисоваться. А когда фон за ночь уезжает в сорок, значит поменялось что-то выше по конвейеру. Получается ровно ваш сигнал, только на уровне отдельной записи.
Проверка домена по списку TLD — забираю, это честнее моего блок-листа. У меня он полз ровно так же: сначала jpg и png, потом webp, потом avif, и каждый раз казалось, что вот теперь-то список полный. Правило «последний сегмент должен быть существующей зоной» снимает весь класс разом, а .zip и .mov в исключениях — две строки вместо бесконечной ленты расширений.
Про число расхождений в метрике — у нас именно это в итоге и стало главным сигналом, только не в штуках, а в распределении причин отказа. Сама доля отказов может не сдвинуться вообще, а внутри вчера было поровну по четырём причинам, сегодня одна съела всё — и это гарантированно поломка выше по конвейеру, а не пользователи внезапно стали хуже фотографировать.
Добавлю грабли из соседней области — я автоматизирую не карты, а чужие редакторы через CDP, но два места одинаковые для любого браузерного скрапера.

Скрапер Google Maps на Playwright: семь граблей, на которые я наступил