fix(tradein/avito): detail_backfill ходил curl'ом, который не решает PoW-челлендж #3049
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#3049
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/avito-backfill-browser-transport"
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?
Что не так
Замер на проде 2026-08-21 показал, почему
avito_detail_backfillпочти не обогащает карточки: Авито за QRATOR отдаёт JavaScript proof-of-work челлендж (startPow→ кукаpow_solved→ self-reload черезwindow.location = location.href).curl_cffiне исполняет JS и пройти его не может в принципе — сколько ни чини отпечаток.Задание при этом принудительно ходит именно curl'ом:
AVITO_DETAIL_BACKFILL_USE_CURL=trueв рантайм-env перекрываетSCRAPER_FETCH_MODE=browser.Цифры
countersпоследних прогоновavito_detail_backfill:Браузерный путь на том же проде в тот же день — ~74%: 17/23 в инлайн-обогащении свипа и 2/3 в точечной проверке
fetch_detail(browser_fetcher=...)после мержа #3048.Побочный эффект: поля дома, которые чинил #3048 (
house_type,total_floors_house, лифты, метро, признак собственника), до бэкфилла просто не доходили — страница не открывалась.Почему обоснование старого флага больше не действует
Комментарий у настройки объяснял
use_curl=Trueтак: browser-фетч в бэкфилле открывает десятки коннектов, превышает cap прокси-аккаунтаauvи роняет всё в HTTP 500. Сегодня это не так:BROWSER_CONCURRENCY=1— сайдкар сериализует запросы, десятков коннектов не бывает;SCRAPER_PROXY_URL, что и curl-путь, а не черезauv.Как сделано
Переключение — в
docker-compose.prod.yml(environment:перекрываетenv_file), а не правкой рантайм-env на хосте. Так изменение остаётся в репозитории, проходит ревью и переживаетgit reset --hardпри деплое без дрейфа конфигурации.Дефолт в
config.pyнамеренно оставленTrue— другие окружения вслепую не трогаем; устаревшее обоснование там помечено как неактуальное для Авито.Проверка
docker-compose.prod.ymlпарсится,services.scraper.environment.AVITO_DETAIL_BACKFILL_USE_CURLрезолвится вfalse;enrichedвcountersближайшего прогона и ненулевойhouses_enriched.Что остаётся за рамками
BROWSER_CONCURRENCY=1, окно бэкфилла 0-23) — мерять после деплоя, при деградации свипов сужать окно.?context=срезается вavito_detail_backfill.py:433(#3035).detail.py(#3044).Замер на проде 2026-08-21: Авито за QRATOR отдаёт JavaScript proof-of-work челлендж (startPow → кука pow_solved → self-reload через window.location). curl_cffi не исполняет JS и пройти его не может в принципе. Что это давало в цифрах (counters прогонов avito_detail_backfill): run 4508: enriched 3 / attempted 46 run 4394: enriched 2 / attempted 47 run 4348: enriched 4 / attempted 53 ~6% успеха. Браузерный путь на том же проде — ~74% (17/23 в инлайн-обогащении свипа, 2/3 в точечной проверке после #3048). То есть задание работало почти вхолостую, а поля дома, которые чинил #3048, до карточек просто не доходили. Исходное обоснование AVITO_DETAIL_BACKFILL_USE_CURL=true (browser открывает десятки коннектов и превышает cap прокси-аккаунта auv) больше не действует: браузер сериализован BROWSER_CONCURRENCY=1 и ходит через тот же backconnect SCRAPER_PROXY_URL, что и curl-путь. Переключение сделано в docker-compose.prod.yml (environment перекрывает env_file), а не правкой рантайм-env на хосте — чтобы изменение осталось в репозитории и пережило deploy без дрейфа конфигурации. Дефолт в config.py оставлен True: другие окружения не трогаем вслепую, но устаревшее обоснование там помечено.