Корень банов 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.