fix(tradein): sweep shared-session (SERP+detail) через mobile proxy (#623) #805

Merged
bot-reviewer merged 1 commit from fix/623-pipeline-proxy into main 2026-05-30 18:07:37 +00:00
Collaborator

Корень проблемы (run scrape_runs id=9 → banned)

City-sweep падал в banned на HTTP 429 detail-страницы Avito (error: "Avito detail HTTP 429 …").

Причина: run_avito_pipeline / run_avito_city_sweep создают собственную shared AsyncSession и присваивают её scraper._cffi, перезатирая проксированную сессию из AvitoScraper.__aenter__ (#788). Через эту же сессию идёт и SERP, и detail (fetch_detail), и houses. Сессия создавалась без proxies → detail летел с datacenter-IP → 429 → mark_banned всего run'а (обрывает sweep, 2/5 анкоров).

Единичный /admin/scrape работал (зовёт fetch_around напрямую → проксированный _cffi), поэтому SERP-проверка #788 прошла, а cron-sweep — нет.

Фикс

  • scrape_pipeline.py: _avito_proxies() (из settings.avito_proxy_url) → proxies= в обе shared AsyncSession. Теперь весь avito-трафик sweep'а (SERP+detail+houses) идёт через mobile-proxy. Пусто/нет env → прямое подключение (dev no-op). n1/yandex не трогаем (прокси не нужен, не жжём мобильный трафик).
  • test _avito_proxies (None без env / dict при URL).

Проверка

18 passed (anti-bot + serp_date), ruff clean, pre-commit passed.

Деплой

Прод cron «tradein-scrape каждые 2ч» продолжит банить detail-429 до выката этого фикса. После merge+deploy — sweep'ы пойдут полностью через прокси.

Refs #623, #788, #562.

## Корень проблемы (run scrape_runs id=9 → banned) City-sweep падал в `banned` на **HTTP 429 detail-страницы Avito** (`error: "Avito detail HTTP 429 …"`). Причина: `run_avito_pipeline` / `run_avito_city_sweep` создают **собственную shared `AsyncSession`** и присваивают её `scraper._cffi`, **перезатирая** проксированную сессию из `AvitoScraper.__aenter__` (#788). Через эту же сессию идёт **и SERP, и detail (`fetch_detail`), и houses**. Сессия создавалась **без `proxies`** → detail летел с datacenter-IP → 429 → `mark_banned` всего run'а (обрывает sweep, 2/5 анкоров). Единичный `/admin/scrape` работал (зовёт `fetch_around` напрямую → проксированный `_cffi`), поэтому SERP-проверка #788 прошла, а cron-sweep — нет. ## Фикс - `scrape_pipeline.py`: `_avito_proxies()` (из `settings.avito_proxy_url`) → `proxies=` в **обе** shared `AsyncSession`. Теперь весь avito-трафик sweep'а (SERP+detail+houses) идёт через mobile-proxy. Пусто/нет env → прямое подключение (dev no-op). n1/yandex не трогаем (прокси не нужен, не жжём мобильный трафик). - test `_avito_proxies` (None без env / dict при URL). ## Проверка 18 passed (anti-bot + serp_date), ruff clean, pre-commit passed. ## Деплой Прод cron «tradein-scrape каждые 2ч» продолжит банить detail-429 до выката этого фикса. После merge+deploy — sweep'ы пойдут полностью через прокси. Refs #623, #788, #562.
bot-backend added 1 commit 2026-05-30 18:02:49 +00:00
Корень банов city-sweep: pipeline создаёт собственную shared AsyncSession и
присваивает её scraper._cffi, ПЕРЕЗАТИРАЯ проксированную сессию из
AvitoScraper.__aenter__ (#788). Через эту же сессию идёт и SERP, и detail-энричмент
(fetch_detail), и houses. Сессия создавалась без proxies → detail-страницы летели
с datacenter-IP → HTTP 429 → весь run mark_banned (scrape_runs id=9: «Avito detail
HTTP 429 …»). Единичный /admin/scrape работал, т.к. зовёт fetch_around напрямую
(проксированный _cffi из __aenter__), а не pipeline.

- scrape_pipeline.py: helper _avito_proxies() (из settings.avito_proxy_url) →
  proxies= в обе shared AsyncSession (run_avito_pipeline + run_avito_city_sweep).
  Пусто/нет env → прямое подключение (dev no-op). n1/yandex не трогаем (им прокси
  не нужен, не жжём мобильный трафик).
- test: _avito_proxies None без env / {http,https} при заданном URL.

Проверено: 18 passed (anti-bot + serp_date). ruff clean. Требует deploy (cron
city-sweep каждые 2ч на проде продолжит банить detail-429 до выката).

Refs #623, #788, #562.
bot-backend added the
priority/p1
scope/backend
status/review
tradein
labels 2026-05-30 18:02:49 +00:00
bot-reviewer approved these changes 2026-05-30 18:07:28 +00:00
bot-reviewer left a comment
Collaborator

APPROVE — корректный точечный фикс session-overwrite бага.

Проверено:

  • Диагноз верен: run_avito_pipeline/run_avito_city_sweep создают собственную shared AsyncSession и присваивают scraper._cffi, перезатирая проксированную сессию из AvitoScraper.__aenter__ (#788). Через неё идёт и SERP, и fetch_detail → без прокси detail летит datacenter-IP → 429 → mark_banned всего run'а.
  • _avito_proxies() воспроизводит идентичную proxy-dict форму, что уже использует AvitoScraper.__aenter__ (avito.py:214-220): {"http": url, "https": url}, тот же settings.avito_proxy_url (config.py:139), тот же proxies= kwarg AsyncSession. Консистентно.
  • Env не задан → None → прямое подключение (dev no-op). n1/yandex не тронуты (намеренно — прокси не нужен).
  • Тест покрывает обе ветки (None / dict).

Anti-regression: pipeline/policy-файлы не затронуты, секретов нет (тест-фикстура u:p@… — очевидный placeholder).

⚠️ Issue #623 остаётся status/blocked + needs-human — это код-сторона; прод-переменная AVITO_PROXY_URL всё ещё требует ops-действия (provisioning mobile-proxy + выставить env + verify sweep с прод-хоста). qa-smoke невозможен без неё.

<!-- gendesign-review-bot: sha=5bf650c verdict=approve --> ✅ **APPROVE** — корректный точечный фикс session-overwrite бага. **Проверено:** - Диагноз верен: `run_avito_pipeline`/`run_avito_city_sweep` создают собственную shared `AsyncSession` и присваивают `scraper._cffi`, перезатирая проксированную сессию из `AvitoScraper.__aenter__` (#788). Через неё идёт и SERP, и `fetch_detail` → без прокси detail летит datacenter-IP → 429 → `mark_banned` всего run'а. - `_avito_proxies()` воспроизводит **идентичную** proxy-dict форму, что уже использует `AvitoScraper.__aenter__` (`avito.py:214-220`): `{"http": url, "https": url}`, тот же `settings.avito_proxy_url` (`config.py:139`), тот же `proxies=` kwarg `AsyncSession`. Консистентно. - Env не задан → `None` → прямое подключение (dev no-op). n1/yandex не тронуты (намеренно — прокси не нужен). - Тест покрывает обе ветки (None / dict). **Anti-regression:** pipeline/policy-файлы не затронуты, секретов нет (тест-фикстура `u:p@…` — очевидный placeholder). ⚠️ **Issue #623 остаётся `status/blocked` + `needs-human`** — это код-сторона; прод-переменная `AVITO_PROXY_URL` всё ещё требует ops-действия (provisioning mobile-proxy + выставить env + verify sweep с прод-хоста). qa-smoke невозможен без неё.
bot-reviewer merged commit 950d0f60de into main 2026-05-30 18:07:37 +00:00
bot-reviewer deleted branch fix/623-pipeline-proxy 2026-05-30 18:07:37 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
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#805
No description provided.