fix(tradein/avito): браузерный путь ходил на каждую карточку холодным (#3251) #3267
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#3267
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/3180-avito-warm-context"
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?
Закрывает браузерную часть #3251 для Авито. Хранилище авторизованных сессий (#3179/#3180) этой правкой НЕ заменяется и не блокируется.
Что было сломано
1. Пройденный QRATOR proof-of-work выбрасывался после каждой карточки.
reuse_contextво всём репозитории передаёт ЕДИНСТВЕННЫЙ вызов —domclick_detail_backfill.py:346. Значит каждый/fetchАвито шёл черезbrowser.new_page()сайдкара, то есть новый изолированный context с пустой банкой кук.В логе прод-сайдкара это видно прямо:
PoW-челлендж снят за ~1000мспечатается на каждой успешной карточке — челлендж решается заново каждый раз, а не один раз на прогон.Эффект той же правки у Домклика измерен и записан в
domclick_detail_backfill.py:331-338: 26 последовательных фетчей = 100% блоков, те же карточки в тёплом контексте = 5/5 за ~2с.2. Сам заход был голым.
Написанный для Авито прогрев (
warm_up_session, яндекс-referer → выдача Авито → антибот-куки) живёт только в curl-пути и с 22.08 в проде мёртв:AVITO_DETAIL_BACKFILL_USE_CURL=false.Что сделано
avito_detail_backfill:reuse_context=True+request_context_reset()ровно один раз за прогон и только наAvitoBlockedError(с подтипами). Не наAvitoSidecarUnavailableError— это подтипAvitoRateLimitedError, отказ нашего тракта, а не бан площадки; и не наAvitoListingGoneError. Зеркалит #3212: сброс на каждый блок сам себя поддерживает — пропуск живёт в context'е, сброс его выбрасывает, повторная проверка с того же IP снова блокируется, одна осечка превращается в каскад.fetch_detail: необязательныеorigin/browser_referer. Имяrefererуже занято под Referer curl-пути — это разные фетчеры и разные поля, специально разведены. ДефолтNone→ payload и поведениеcity_sweep/pipeline/adminне меняются._serp_origin_for(card_url): городская SERP-выдача из URL карточки, хост берётся из самого url (не хардкодитсяwww.avito.ru), непарсящийся url →None→ прежнее поведение.Попутный дефект сайдкара, найденный при переносе
_ensure_anchor_pageвозвращалаTrueна любую живую якорную вкладку, не сверяя её с запрошеннымorigin. А origin у обоих caller'ов выводится из URL карточки и меняется вместе с городом: у Авито — сегмент пути (/ekaterinburg/…vs/verhnyaya_pyshma/…), у Домклика — поддомен.Значит после первой же карточки другого города Referer называл выдачу, которую этот контекст никогда не открывал: ни куки её, ни тайминга — площадка видит заявленный переход без единого следа. Ровно то, что #3258 запретил делать фолбэкам якорного поиска.
Добавлен
_anchor_origins: origin сменился → вкладка переоткрывается на новый. Чинит и Домклик тоже (его detail-бэкфилл ходит по нескольким городским поддоменам).Чего здесь сознательно НЕТ
BROWSER_ANCHOR_VIA_SEARCHостаётся дефолтным"domclick". Расширять список без отдельного замера запрещает комментарий у самой константы, и я это не нарушаю.avito_session_cookiesне существует (у Циана, Яндекса и Домклика такие есть), поэтому передавать вcookies=пока нечего. Параметр намеренно не прокидывал.?context=из выдачи — #3035, отдельно.База для сравнения (снята ДО выката)
avito_detail_backfill, доля блоков от попыток по суткам:Сравнивать после деплоя по доле блоков от попыток и по обогащению за сутки, а НЕ по статусу прогона: ratio-критерий обрывает каждый прогон без исключения, и
bannedпро площадку ничего не говорит (разбиралось при калибровке #3184).Отдельно держать в уме: часть отказов в логах —
NS_ERROR_PROXY_BAD_GATEWAY/NS_ERROR_ABORT, то есть прокси, а не площадка.AvitoSidecarUnavailableErrorнаследуетAvitoRateLimitedErrorи потому инкрементитcounters.blocked— доля блоков этим завышена. Не в scope, но цифры читать с поправкой.Проверено
test_avito_detail_backfill.py:730, тест падал. Но это довод не за условные kwargs, а за то, чтобы стаб терпел рост сигнатуры: заменил обходной путь на**_extraв стабе, kwargs теперь передаются безусловно.Refs #3251, #3180, #3118, #3212, #3247, #3258