Обогащение Авито берёт карточки в свежем контексте браузера #3596

Merged
lekss361 merged 1 commit from fix/avito-detail-fresh-context into main 2026-09-19 20:55:50 +00:00
Owner

Что не так

avito_detail_backfill держал один контекст браузера на весь прогон (reuse_context=True). Авито закрывает карточки проверкой работой на JS, её куки pow_challenge / pow_solved живут около пяти минут (замерено: выданы 23:08, протухли 23:13). Прогон живёт десятки минут — токен протухает, в живом контексте не обновляется, и каждая следующая карточка получает бан-страницу. Защита по доле блокировок затем рвёт прогон как banned.

Симптом на проде: обогащение Авито 8.5% (5 322 из 62 360 активных) против cian 25.7% и yandex 64.0%. За 14 дней: 54 прогона banned, 36 failed, 22 done.

Замер

Прод, 19.09. Отдельная копия сайдкара (probe-browser, та же сборка, изолированная), один и тот же прокси, одни и те же 16 карточек на плечо, схема A-B-A:

плечо контекст успешно сек на карточку
A свежий на карточку 14 / 16 8.7
B общий на прогон 6 / 16 8.4
A' свежий на карточку 13 / 16 7.9

Скорости свежий контекст не стоит — это опровергает довод «4-5 с против 17-52 с», записанный в комментарии кода. В плече B отказы нарастают по ходу: первые три карточки успешны, последние пять подряд забанены — ровно картина протухшего токена, а не бана адреса.

Отдельно: ручная сессия camoufox через тот самый «сожжённый» прод-прокси дала 148 запросов, все 200 (кроме одного 407 на авторизацию прокси), ноль бан-страниц, 28 кук. Адрес не забанен — ломался именно способ хождения.

Что меняется

  • reuse_context=settings.avito_detail_reuse_context вместо жёсткого True (avito_detail_backfill.py:~430).
  • Сброс контекста при ротации прокси вызывается только когда переиспользование включено (if settings.avito_detail_reuse_context and not context_reset_used).
  • Новая настройка AVITO_DETAIL_REUSE_CONTEXT, дефолт false — старый режим возвращается переменной окружения, без выката.
  • Комментарии в коде переписаны: история #3118 сохранена, но рядом стоит замер, который её для Авито опровергает.

ДомКлик, Циан и SERP не тронуты — переиспользование контекста там остаётся включённым, для ДомКлика оно нужно по существу (кука QRATOR).

Проверка

13 тестов в test_3251_avito_warm_context.py + новом test_avito_detail_reuse_context_default.py зелёные. Проверено отдельно, что дефолт настройки False, а AVITO_DETAIL_REUSE_CONTEXT=true даёт True.

После мержа

Плановое обогащение сейчас выключено (scrape_schedules.enabled=false для avito_detail_backfill) — включу обратно после выката, чтобы первый настоящий прогон дал чистую проверку.

🤖 Generated with Claude Code

https://claude.ai/code/session_01JY6iWDnGDthdvsMWgK1BMG

## Что не так `avito_detail_backfill` держал один контекст браузера на весь прогон (`reuse_context=True`). Авито закрывает карточки проверкой работой на JS, её куки `pow_challenge` / `pow_solved` живут около пяти минут (замерено: выданы 23:08, протухли 23:13). Прогон живёт десятки минут — токен протухает, в живом контексте не обновляется, и каждая следующая карточка получает бан-страницу. Защита по доле блокировок затем рвёт прогон как `banned`. Симптом на проде: обогащение Авито 8.5% (5 322 из 62 360 активных) против cian 25.7% и yandex 64.0%. За 14 дней: 54 прогона `banned`, 36 `failed`, 22 `done`. ## Замер Прод, 19.09. Отдельная копия сайдкара (`probe-browser`, та же сборка, изолированная), один и тот же прокси, одни и те же 16 карточек на плечо, схема A-B-A: | плечо | контекст | успешно | сек на карточку | |---|---|---|---| | A | свежий на карточку | 14 / 16 | 8.7 | | B | общий на прогон | **6 / 16** | 8.4 | | A' | свежий на карточку | 13 / 16 | 7.9 | Скорости свежий контекст не стоит — это опровергает довод «4-5 с против 17-52 с», записанный в комментарии кода. В плече B отказы нарастают по ходу: первые три карточки успешны, последние пять подряд забанены — ровно картина протухшего токена, а не бана адреса. Отдельно: ручная сессия camoufox через тот самый «сожжённый» прод-прокси дала 148 запросов, все 200 (кроме одного 407 на авторизацию прокси), ноль бан-страниц, 28 кук. Адрес не забанен — ломался именно способ хождения. ## Что меняется - `reuse_context=settings.avito_detail_reuse_context` вместо жёсткого `True` (`avito_detail_backfill.py:~430`). - Сброс контекста при ротации прокси вызывается только когда переиспользование включено (`if settings.avito_detail_reuse_context and not context_reset_used`). - Новая настройка `AVITO_DETAIL_REUSE_CONTEXT`, дефолт `false` — старый режим возвращается переменной окружения, без выката. - Комментарии в коде переписаны: история #3118 сохранена, но рядом стоит замер, который её для Авито опровергает. ДомКлик, Циан и SERP не тронуты — переиспользование контекста там остаётся включённым, для ДомКлика оно нужно по существу (кука QRATOR). ## Проверка 13 тестов в `test_3251_avito_warm_context.py` + новом `test_avito_detail_reuse_context_default.py` зелёные. Проверено отдельно, что дефолт настройки `False`, а `AVITO_DETAIL_REUSE_CONTEXT=true` даёт `True`. ## После мержа Плановое обогащение сейчас выключено (`scrape_schedules.enabled=false` для `avito_detail_backfill`) — включу обратно после выката, чтобы первый настоящий прогон дал чистую проверку. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01JY6iWDnGDthdvsMWgK1BMG
lekss361 added 1 commit 2026-09-19 20:25:15 +00:00
fix(avito): карточки берутся в свежем контексте браузера, а не в общем
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 13s
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 Trade-In / backend-tests (pull_request) Successful in 5m1s
65e44c9195
Обогащение держало один контекст браузера на весь прогон
(reuse_context=True). Авито закрывает карточки проверкой работой на JS,
а её куки pow_challenge и pow_solved живут около пяти минут. Прогон
живёт десятки минут, токен протухает и в живом контексте не
обновляется, поэтому после первых карточек каждая следующая получает
бан-страницу, и прогон рвёт защита по доле блокировок.

Замер на проде 19.09, отдельная копия сайдкара, один и тот же прокси,
16 карточек на плечо, схема A-B-A:

  свежий контекст   14/16 и 13/16 успехов,  8.7 и 7.9 с на карточку
  общий контекст     6/16 успехов,          8.4 с на карточку

Времени свежий контекст не стоит, а успешных карточек даёт вдвое
больше. В плече с общим контекстом отказы нарастают по ходу: первые
три успешны, последние пять подряд забанены.

Переиспользование контекста пришло из #3118, где оно нужно ДомКлику,
чтобы не терять куку его защиты. Для ДомКлика это остаётся верным,
на Авито было перенесено по аналогии и замером опровергнуто.

Поведение вынесено в AVITO_DETAIL_REUSE_CONTEXT с дефолтом false,
чтобы вернуть старый режим без выката.
lekss361 merged commit e811b6dfbc into main 2026-09-19 20:55:50 +00:00
lekss361 deleted branch fix/avito-detail-fresh-context 2026-09-19 20:55:50 +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#3596
No description provided.