fix(tradein/avito): detail_backfill ходил curl'ом, который не решает PoW-челлендж #3049

Merged
lekss361 merged 1 commit from fix/avito-backfill-browser-transport into main 2026-08-21 22:51:35 +00:00
Owner

Что не так

Замер на проде 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:

run enriched failed attempted успех
4508 3 42 46 6.5%
4394 2 45 47 4.3%
4348 4 48 53 7.5%

Браузерный путь на том же проде в тот же день — ~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 — сайдкар сериализует запросы, десятков коннектов не бывает;
  • браузер ходит через тот же backconnect 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;
  • pre-commit (yaml, ruff, ruff-format) зелёный;
  • после деплоя ожидается рост enriched в counters ближайшего прогона и ненулевой houses_enriched.

Что остаётся за рамками

  • Контention с свипами на единственном браузерном слоте (BROWSER_CONCURRENCY=1, окно бэкфилла 0-23) — мерять после деплоя, при деградации свипов сужать окно.
  • ?context= срезается в avito_detail_backfill.py:433 (#3035).
  • Классификация 439/429 в detail.py (#3044).
## Что не так Замер на проде 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`: | run | enriched | failed | attempted | успех | |---|---|---|---|---| | 4508 | 3 | 42 | 46 | 6.5% | | 4394 | 2 | 45 | 47 | 4.3% | | 4348 | 4 | 48 | 53 | 7.5% | Браузерный путь на том же проде в тот же день — **~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` — сайдкар сериализует запросы, десятков коннектов не бывает; - браузер ходит через тот же backconnect `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`; - pre-commit (yaml, ruff, ruff-format) зелёный; - после деплоя ожидается рост `enriched` в `counters` ближайшего прогона и ненулевой `houses_enriched`. ## Что остаётся за рамками - Контention с свипами на единственном браузерном слоте (`BROWSER_CONCURRENCY=1`, окно бэкфилла 0-23) — мерять после деплоя, при деградации свипов сужать окно. - `?context=` срезается в `avito_detail_backfill.py:433` (#3035). - Классификация 439/429 в `detail.py` (#3044).
lekss361 added 1 commit 2026-08-21 21:12:35 +00:00
fix(tradein/avito): detail_backfill ходил curl'ом, который не решает PoW-челлендж
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI / changes (pull_request) Successful in 9s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 4m32s
b61123d7a6
Замер на проде 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: другие окружения не трогаем вслепую, но устаревшее обоснование
там помечено.
lekss361 merged commit 7f6dbc9a59 into main 2026-08-21 22:51:35 +00:00
lekss361 deleted branch fix/avito-backfill-browser-transport 2026-08-21 22:51:35 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3049
No description provided.