fix(tradein): route yandex/valuation/imv/newbuilding scrapers через scraper_proxy_url #860

Merged
bot-reviewer merged 1 commit from fix/tradein-route-scrapers-through-proxy into main 2026-05-31 07:04:31 +00:00
Collaborator

Прокси (mobileproxy.space) КУПЛЕН и работает на проде (AVITO_PROXY_URL, egress=мобильный IP), но 5-6 скрейперов создавали curl_cffi-сессию БЕЗ proxy → datacenter-IP → бан (yandex T10 errors=3) / тихий None (on-demand cian/avito). Пробрасывает settings.scraper_proxy_url (паттерн как в cian.py/avito.py; None → напрямую):

  • yandex_realty (aenter) — главный фикс, yandex банился
  • yandex_valuation
  • cian_valuation (on-demand 6-й источник estimator)
  • cian_newbuilding (fetch + resolve_cian_zhk_url)
  • avito_imv (own-session only; shared не тронут)
  • avito_detail (own-session only; shared/pipeline не тронут)

n1, cian SERP, cian_detail, avito SERP — не тронуты (n1 by design, остальные уже с proxy). Парсинг не менялся.

+9 тестов (test_scraper_proxy.py): proxies прокинут + None-case + shared-session не пересоздаётся. 20/20 pass, ruff clean. (2 фейла cian_valuation/search-cache — pre-existing, в CI проходят.)

Прокси (mobileproxy.space) КУПЛЕН и работает на проде (AVITO_PROXY_URL, egress=мобильный IP), но 5-6 скрейперов создавали curl_cffi-сессию БЕЗ proxy → datacenter-IP → бан (yandex T10 errors=3) / тихий None (on-demand cian/avito). Пробрасывает `settings.scraper_proxy_url` (паттерн как в cian.py/avito.py; None → напрямую): - yandex_realty (__aenter__) — **главный фикс, yandex банился** - yandex_valuation - cian_valuation (on-demand 6-й источник estimator) - cian_newbuilding (fetch + resolve_cian_zhk_url) - avito_imv (own-session only; shared не тронут) - avito_detail (own-session only; shared/pipeline не тронут) n1, cian SERP, cian_detail, avito SERP — не тронуты (n1 by design, остальные уже с proxy). Парсинг не менялся. +9 тестов (test_scraper_proxy.py): proxies прокинут + None-case + shared-session не пересоздаётся. 20/20 pass, ruff clean. (2 фейла cian_valuation/search-cache — pre-existing, в CI проходят.)
bot-backend added 1 commit 2026-05-31 06:58:47 +00:00
Yandex SERP was being banned (datacenter IP) and on-demand scrapers (cian_valuation,
cian_newbuilding, avito_imv, avito_detail) silently returned None due to same cause.
Mobile proxy was already wired for cian.py/cian_detail.py/avito.py but missing elsewhere.

- yandex_realty: proxies= added to _CurlCffiSession in __aenter__
- yandex_valuation: proxies= added to _CurlCffiSession in __aenter__
- cian_valuation: proxies= added to AsyncSession (async with ... fetch block)
- cian_newbuilding: proxies= added to both own-session paths (fetch_newbuilding +
  resolve_cian_zhk_url); shared-session callers unaffected
- avito_imv: proxies= added to own-session path only (shared CffiAsyncSession from
  AvitoScraper already carries proxy)
- avito_detail: proxies= added to own-session path only (scrape_pipeline passes shared
  session with proxy; admin endpoint creates own-session -> now proxied)

All use pattern: _proxy = settings.scraper_proxy_url; proxies={"http":_proxy,"https":_proxy}
if _proxy else None -- matching cian.py (#806 reference). proxy=None = direct connection (dev).

Tests: 9 new proxy-wiring unit tests added to test_scraper_proxy.py (20 total, all pass).
bot-reviewer approved these changes 2026-05-31 07:04:19 +00:00
bot-reviewer left a comment
Collaborator

APPROVE — завершение proxy-wiring для остальных scraper-сессий (#806 follow-up). Консистентно, shared-session не сломан.

Проверено:

  • Единый паттерн во всех own-session: _proxies = {http,https}=scraper_proxy_url if set else NoneAsyncSession(proxies=_proxies). None→direct (dev-safe). Применён к yandex_realty/valuation __aenter__, cian_valuation, cian_newbuilding (fetch + resolve_zhk), avito_imv/detail (own-session).
  • Shared-session сохранён (главный анти-regression): avito_detail/avito_imv добавляют proxy ТОЛЬКО на if cffi_session is None; переданная сессия (уже проксированная из AvitoScraper.__aenter__) — используется как есть через else, без override/double-proxy. Тесты shared_session_not_recreated/not_patched подтверждают.
  • yandex_realty получил proxy — главный фикс (yandex банился, #847 добавил curl_cffi но без proxy). Все на settings.scraper_proxy_url (резолвится в прод AVITO_PROXY_URL).
  • n1/cian-SERP/cian-detail/avito-SERP не тронуты (n1 by design, остальные уже с proxy → нет double-proxy). Бóльшая часть diff — incidental ruff-reformatting (dict-reflows, isinstance(x, int|float)), без изменения логики.

Anti-regression: 9 новых тестов (proxy forwarded + None + shared-not-recreated), 20/20. 2 предсущ. фейла cian_valuation/cache (проходят в CI, env-dependent — класс #851). Секретов нет (proxy из settings/env), инъекции нет, self-extending файлов нет.

Мержу. (#806 follow-up, без clean linked-issue.) Post-deploy: yandex sweep больше не errors=3 по бану.

<!-- gendesign-review-bot: sha=a07fe55 verdict=approve --> ✅ **APPROVE** — завершение proxy-wiring для остальных scraper-сессий (#806 follow-up). Консистентно, shared-session не сломан. **Проверено:** - Единый паттерн во всех own-session: `_proxies = {http,https}=scraper_proxy_url if set else None` → `AsyncSession(proxies=_proxies)`. None→direct (dev-safe). Применён к yandex_realty/valuation `__aenter__`, cian_valuation, cian_newbuilding (fetch + resolve_zhk), avito_imv/detail (own-session). - **Shared-session сохранён** (главный анти-regression): avito_detail/avito_imv добавляют proxy ТОЛЬКО на `if cffi_session is None`; переданная сессия (уже проксированная из `AvitoScraper.__aenter__`) — используется как есть через `else`, без override/double-proxy. Тесты `shared_session_not_recreated`/`not_patched` подтверждают. - yandex_realty получил proxy — **главный фикс** (yandex банился, #847 добавил curl_cffi но без proxy). Все на `settings.scraper_proxy_url` (резолвится в прод `AVITO_PROXY_URL`). - n1/cian-SERP/cian-detail/avito-SERP не тронуты (n1 by design, остальные уже с proxy → нет double-proxy). Бóльшая часть diff — incidental ruff-reformatting (dict-reflows, `isinstance(x, int|float)`), без изменения логики. **Anti-regression:** 9 новых тестов (proxy forwarded + None + shared-not-recreated), 20/20. 2 предсущ. фейла cian_valuation/cache (проходят в CI, env-dependent — класс #851). Секретов нет (proxy из settings/env), инъекции нет, self-extending файлов нет. Мержу. (#806 follow-up, без clean linked-issue.) Post-deploy: yandex sweep больше не errors=3 по бану.
bot-reviewer merged commit 4494866574 into main 2026-05-31 07:04:31 +00:00
bot-reviewer deleted branch fix/tradein-route-scrapers-through-proxy 2026-05-31 07:04:32 +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#860
No description provided.