fix(tradein/scraper): блок QRATOR у Домклика больше не помечает прогон успешным (#2657) #2667
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#2667
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/2657-domclick-block-not-done"
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?
Что было
run_domclick_city_sweepимел honest-status гейт (#1968), но он требовал одновременно блок И ноль лотов:QRATOR срабатывает не с первого запроса — к моменту блока часть комнатных бакетов уже собрана,
lots_fetched > 0, и распознанный блок уходил вdone.Прод (
scrape_runs, source=domclick_city_sweep, все прогоны с ключомblockedв counters):donefailedТо есть 13 из 13 прогонов, где блок был распознан, получили
done— ни один распознанный блок ни разу не дал не-doneстатус. При этом они забирали 39-464 лота вместо ~6300 по ЕКБ. А 20failed— это другой путь (blocked=0,errors_count=1), там блок доDomClickBlockedErrorне доехал.Что стало
Распознанный блок НИКОГДА не даёт
done:Чем отличается от #2642
#2642 для Циана/Яндекса ввёл правило
attempts > 0 and failures == attempts→banned, с явным анти-флапом: провал одного anchor'а среди успешных баном не считается.У Домклика anchor'ов нет — sweep линейный по
ROOM_BUCKETS, и первый жеDomClickBlockedErrorделаетbreakвfetch_city: оставшиеся бакеты не пробуются вовсе. Считать это «частичным провалом, который не бан» нельзя — прогон физически не доделал работу. Поэтому порог здесь не «все попытки провалились», а «блок был». Анти-флап-риска нет: счётчикblockedрастёт только изDomClickBlockedError, то есть только по маркерамDOMCLICK_BLOCK_MARKERS.Статус выбран
banned, а неfailed— симметрично #2642: это external constraint, а не наш баг, и это тот статус, который доступен как триггер ротации IP (#2611). Сама ротация из кода не вызывается (ASOCKS_API_TOKENна владельце) — тот же скоуп-гард, что в #2642.Побочно: случай «блок + 0 лотов» тоже переехал
failed→banned— теперь у распознанного блока одно правило, а не два разных статуса. Для алерта это нейтрально:_alert_if_consecutive_failuresсчитаетfailedиbannedодинаково.Путь до прокси-пула не тронут
fetcher.report_ban(...)(#2600 п.1) живёт вproviders/domclick/serp.py::fetch_city, срабатывает внутри живого lease и раньше финализации прогона. Правка только вpipeline.py, в serp.py ни строки. Статус прогона и пометка прокси — разные вещи, обе на месте; регрессию стережёт существующийtest_fetch_city_reports_ban_on_qrator_block.Test plan
test_domclick_city_sweep_blocked_with_lots_marks_banned— новый, ловит ровно прод-случай (блок после части лотов)test_domclick_city_sweep_blocked_banned— блок + 0 лотов →banned(былblocked_failed)test_domclick_city_sweep_fetch_errors_without_block_stays_failed— анти-оверрич: ошибки без блока остаютсяfailedtest_domclick_city_sweep_honest_empty_stays_done— анти-оверрич: честная пустота остаётсяdonemark_doneвместоmark_bannedиmark_failedвместоmark_banned. Два анти-оверрич-теста зелёные и без фикса — это гарды от регрессии в другую сторону, не доказательство фикса; говорю честно.test_search_api.py::test_search_cache_hit(401 vs 200), красный и на чистомorigin/main, к этой правке отношения не имеет.domclick_city_sweepдолжен датьbannedвместоdone(блокировки там ежедневные — верификация ожидается в течение суток, в отличие от Циана/Яндекса, где живого эпизода с #2642 так и не было).Что НЕ входит и почему
scripts/ingest_domclick_jsonl.py) — отдельное решение (прошить черезrun_idлибо убрать).banned— статус теперь достижим как триггер, вызов не подключён (тот же гард, что в #2642).blocked=0, errors=1— блок, не доехавший доDomClickBlockedError(исключение из fetcher'а вместо HTML с маркерами). Они и сейчас честноfailed, неdone, поэтому в скоуп «блок не должен быть done» не попадают. Отдельный вопрос — стоит ли их классифицировать как блок; прод-логи за тот период уже ротировались (контейнер перезапущен), диагностировать сейчас не на чем.Refs #2657