Авито: браузерный путь берёт сохранённую сессию + прогрев, сейчас ходит холодным #3180

Open
opened 2026-08-28 16:57:51 +00:00 by bot-backend · 1 comment
Collaborator

Sub-issue #3177, Workers — после хранилища сессий.

Причина деградации

22.08 коммит b61123d7 перевёл прод на браузерный режим (AVITO_DETAIL_BACKFILL_USE_CURL: "false", docker-compose.prod.yml:398). По сути верно — curl не решает PoW-челлендж. Но прогрев сессии написан только для curl-пути: warm_up_session(session: AsyncSession), providers/avito/detail.py:345, цепочка «органический referer → поиск Авито → антибот-куки».

Браузерный путь этой цепочки не имеет и ходит на карточки холодным. Обогащение по дням после переключения: 161 → 161 → 116 → 23 → 1 → 2.

Что сделать

  1. Перед сбором подгружать сохранённую сессию в браузерный контекст; после прогона сохранять обратно.
  2. Нет живой сессии → прогрев в браузере (порт цепочки из warm_up_session), затем сохранить результат в хранилище.
  3. Сохранять ?context= из выдачи при переходе на карточку — в замере 28.08 карточки открывались именно с ним. Пересекается с #3035, где бэкфилл его отрезает.
  4. Блок при живой сессии → помечать blocks_since_ok, не сжигать сессию с первого раза.

Ориентир по темпу

Замер 28.08: пять карточек подряд, пауза 1,5 с, 5/5 по 200. Это не потолок — просто столько проверено. Ceiling измерить отдельно и выставить темп с запасом.

Приёмка

  • Прогон стартует с сохранённой сессией, не с чистого браузера
  • Доля блоков в прогоне заметно ниже нынешних 36% на свежем адресе
  • ?context= доезжает до запроса карточки

Оценка M. Refs #3177, #3035

Sub-issue #3177, **Workers** — после хранилища сессий. ## Причина деградации 22.08 коммит `b61123d7` перевёл прод на браузерный режим (`AVITO_DETAIL_BACKFILL_USE_CURL: "false"`, `docker-compose.prod.yml:398`). По сути верно — curl не решает PoW-челлендж. Но прогрев сессии написан **только для curl-пути**: `warm_up_session(session: AsyncSession)`, `providers/avito/detail.py:345`, цепочка «органический referer → поиск Авито → антибот-куки». Браузерный путь этой цепочки не имеет и ходит на карточки холодным. Обогащение по дням после переключения: **161 → 161 → 116 → 23 → 1 → 2**. ## Что сделать 1. Перед сбором подгружать сохранённую сессию в браузерный контекст; после прогона сохранять обратно. 2. Нет живой сессии → прогрев в браузере (порт цепочки из `warm_up_session`), затем сохранить результат в хранилище. 3. Сохранять `?context=` из выдачи при переходе на карточку — в замере 28.08 карточки открывались именно с ним. Пересекается с #3035, где бэкфилл его отрезает. 4. Блок при живой сессии → помечать `blocks_since_ok`, не сжигать сессию с первого раза. ## Ориентир по темпу Замер 28.08: пять карточек подряд, пауза 1,5 с, **5/5 по 200**. Это не потолок — просто столько проверено. Ceiling измерить отдельно и выставить темп с запасом. ## Приёмка - [ ] Прогон стартует с сохранённой сессией, не с чистого браузера - [ ] Доля блоков в прогоне заметно ниже нынешних 36% на свежем адресе - [ ] `?context=` доезжает до запроса карточки Оценка M. Refs #3177, #3035
bot-backend added the
enhancement
priority/p1
scope/backend
scrapers
tradein
labels 2026-08-28 16:57:51 +00:00
Author
Collaborator

План после разбора со скептиками опубликован в эпике: #3177 (comment)

Твоя часть — шаги 6-9 (прикладное):

  1. fetch_detail(cookies=...) и проброс из pipeline — параметра сегодня нет (providers/avito/detail.py:471-536, :506 зовёт fetch(full_url) без origin и без кук). Прецедент рядом: domclick/detail.py:504,534.
  2. Браузерный прогрев warm_up_browser_session — повтор curl-цепочки в сайдкаре. Хоп 1 yandex.ru/search без кук (иначе куки Авито уедут Яндексу под его доменом — находка скептика), пауза 2.0-3.5 с на стороне kit между двумя вызовами /fetch, хоп 2 avito.ru/... с origin='https://ya.ru/'.
  3. Учёт блоков и инвалидация. Важное: возврат mark_banned надо разбирать — коды protected/missing/deferred означают, что узел остался в выдаче, и вердикт «мы защитились» выносить нельзя. Плюс принудительный re-warm при расхождении pinned_exit_ip с текущим: ASocks крутит exit-IP того же узла до 3 раз в сутки, так что пин узла ≠ пин адреса.
  4. Тесты, включая негативные: домен куки не переписывается на .www.*, на yandex-хоп куки не уходят.

Битые адреса из первой версии плана исправлены: enrich_consecutive_blockspipeline.py:698-847, proxy_pool.mark_banned:728.

План после разбора со скептиками опубликован в эпике: https://git.gendsgn.ru/lekss361/gendesign/issues/3177#issuecomment-29085 Твоя часть — шаги 6-9 (прикладное): 6. `fetch_detail(cookies=...)` и проброс из pipeline — параметра сегодня нет (`providers/avito/detail.py:471-536`, `:506` зовёт `fetch(full_url)` без origin и без кук). Прецедент рядом: `domclick/detail.py:504,534`. 7. Браузерный прогрев `warm_up_browser_session` — повтор curl-цепочки в сайдкаре. Хоп 1 `yandex.ru/search` **без кук** (иначе куки Авито уедут Яндексу под его доменом — находка скептика), пауза 2.0-3.5 с на стороне kit между двумя вызовами `/fetch`, хоп 2 `avito.ru/...` с `origin='https://ya.ru/'`. 8. Учёт блоков и инвалидация. Важное: **возврат `mark_banned` надо разбирать** — коды `protected`/`missing`/`deferred` означают, что узел остался в выдаче, и вердикт «мы защитились» выносить нельзя. Плюс принудительный re-warm при расхождении `pinned_exit_ip` с текущим: ASocks крутит exit-IP того же узла до 3 раз в сутки, так что пин узла ≠ пин адреса. 9. Тесты, включая негативные: домен куки не переписывается на `.www.*`, на yandex-хоп куки не уходят. Битые адреса из первой версии плана исправлены: `enrich_consecutive_blocks` — `pipeline.py:698-847`, `proxy_pool.mark_banned` — `:728`.
Sign in to join this conversation.
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#3180
No description provided.