fix(tradein/avito): бан-страница площадки уезжала в транспортные сбои и не банила узел (#3283) #3304
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3304
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/3283c-avito-sidecar-ban-is-platform-ban"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Проблема
Сайдкар распознаёт бан-страницу Авито («доступ ограничен: проблема с IP») по маркерам тела и отдаёт
500сban_page=true; клиент поднимаетSidecarBanPageError. У Домклика её разбирают (#3239/#3283), у Авито — нет: она попадала в общийexcept Exceptionи заворачивалась вAvitoSidecarUnavailableError, то есть вban_kind='infra'.Следствие — не ярлык, а неработающая защита:
report_banне вызывался, узел не попадал вscrape_proxy_source_bansи продолжал выдаваться в аренду дляsource=avito.Замер на проде
Прогон 5606 (31.08, 16:14–16:37): 64 бан-страницы за 23 минуты,
ban_kinds={"infra":26,"platform":7}, ноль записей бана для avito, прогон оборван по доле блоков 14/20.enriched=24из 59 попыток.Что сделано
providers/avito/detail.py— веткаexcept SidecarBanPageErrorперед общимexcept Exception. Порядок важен: это подклассhttpx.HTTPStatusError.providers/avito/serp.py— та же проверка до ротации и transient-бюджета. Ротация в этой ветке мертва (max_rot=0), поэтому ретраи маркерного бана ушли бы на тот же забаненный адрес: ещё два захода на площадку и ~4-5 с задержки передreport_ban. Бюджет задуман под блипы сайдкара (503 browser unavailable), а не под отказ площадки.Детект в сайдкаре маркерный и положительный, а не догадка по коду ответа, — переспрашивать его нечем.
Регрессии закрыты тестами
backend/tests/test_3283_avito_sidecar_ban_is_platform_ban.py— 5 тестов в обе стороны:fetch_detail→AvitoBlockedError+report_banвызван;_fetch_serp_html→ то же, плюсfetch.await_count == 1иsleepни разу не ожидался (ретраев нет);500/503безban_page→ остаётсяAvitoSidecarUnavailableError,report_banне вызывается.Проверка
5257 passed, 37 skipped— полный набор backend.ruffчисто.Что НЕ входит
HTTP 439 и затирание
exit_ipвproxy_pool— отдельные PR.Сайдкар распознаёт бан-страницу Авито («доступ ограничен: проблема с IP») по маркерам тела и отдаёт 500 с ban_page=true; клиент поднимает SidecarBanPageError. У Домклика её разбирают (#3239/#3283), у Авито — нет: она попадала в общий `except Exception` и заворачивалась в AvitoSidecarUnavailableError, то есть в ban_kind='infra'. Следствие — не ярлык, а неработающая защита: report_ban не вызывался, узел не попадал в scrape_proxy_source_bans и продолжал выдаваться в аренду для source=avito. Прод, прогон 5606 (31.08): 64 бан-страницы за 23 минуты, ban_kinds={"infra":26,"platform":7}, ноль записей бана для avito, прогон оборван по доле блоков 14/20. detail.py — ветка `except SidecarBanPageError` перед общим `except Exception` (порядок важен: это подкласс httpx.HTTPStatusError). serp.py — та же проверка ДО ротации и transient-бюджета: ротация в этой ветке мертва (max_rot=0), поэтому ретраи маркерного бана ушли бы на тот же забаненный адрес — ещё два захода на площадку и ~4-5 с задержки перед report_ban. Бюджет задуман под блипы сайдкара (503 «browser unavailable»), а не под отказ площадки. Обычная 500 без ban_page по-прежнему остаётся транспортным сбоем и report_ban не вызывает — закреплено тестами в обе стороны. Тесты: 5257 passed, 37 skipped.