[tradein][scrapers] Phase 2 — cian/n1/yandex на camoufox + снять анти-бот костыли (#883) #886

Closed
opened 2026-05-31 10:37:56 +00:00 by lekss361 · 3 comments
Owner

Phase 2 эпика #883. Depends Phase 1 (avito на browser отработал на проде). Переводит cian/n1/yandex + снимает старые анти-бот костыли.

Задача

Перевести оставшиеся скрейперы на BrowserFetcher, удалить per-provider анти-бот хаки (заменены единым browser-механизмом). Парсинг не трогаем.

Files

  • app/services/scrapers/cian.py + cian_detail.py — HTML через fetcher. Удалить: warm-up GET self._cffi.get(f"{base}/") (стр.~91), DMIR_AUTH session-cookies механизм (cian_session), curl_cffi impersonate. (Verified: camoufox отдаёт cian SERP+detail реально, без cookies.)
  • app/services/scrapers/n1.py — HTML через fetcher.
  • app/services/scrapers/yandex_realty.py + yandex_detail.py + yandex_newbuilding.py + yandex_valuation.py — HTML через fetcher. Снять captcha/SmartCaptcha-возню если есть.
  • app/services/scrape_pipeline.py — cian/n1/yandex sweep-функции используют BrowserFetcher.
  • app/core/config.pyscraper_fetch_mode для cian/n1/yandex → browser.
  • Cleanup (после verify): cian_session.py (DMIR cookies), _avito_proxies curl_cffi-специфика, _rotate_ip/_is_firewall_page если больше нигде не нужны.

Definition of Done (бинарно)

  • /scrape (или city-sweep) per source cian/n1/yandex через browser → реальные listings (price/area не-NULL), без banned.
  • cian: больше НЕ требует DMIR_AUTH cookies/warm-up — sweep идёт «из коробки» (разблокирует #843 cian SERP dead).
  • yandex: SERP+detail реальные, без captcha-фейлов.
  • Старые анти-бот модули удалены ИЛИ за флагом; grep DMIR_AUTH|_rotate_ip|warm — только в curl_cffi-fallback ветке.
  • uv run pytest зелёный (моки fetcher); ruff clean.

Не делать

  • НЕ удалять curl_cffi-путь, пока scraper_fetch_mode=browser не отработал на проде ≥ неделю (откат).
  • domclick (#796) — отдельно, не в этой фазе (research, неактивный source).

Эпик #883. Depends: Phase 1. Завершает миграцию.

> Phase 2 эпика #883. Depends Phase 1 (avito на browser отработал на проде). Переводит cian/n1/yandex + снимает старые анти-бот костыли. ## Задача Перевести оставшиеся скрейперы на `BrowserFetcher`, удалить per-provider анти-бот хаки (заменены единым browser-механизмом). Парсинг не трогаем. ## Files - `app/services/scrapers/cian.py` + `cian_detail.py` — HTML через fetcher. **Удалить:** warm-up GET `self._cffi.get(f"{base}/")` (стр.~91), DMIR_AUTH session-cookies механизм (cian_session), curl_cffi impersonate. (Verified: camoufox отдаёт cian SERP+detail реально, без cookies.) - `app/services/scrapers/n1.py` — HTML через fetcher. - `app/services/scrapers/yandex_realty.py` + `yandex_detail.py` + `yandex_newbuilding.py` + `yandex_valuation.py` — HTML через fetcher. Снять captcha/SmartCaptcha-возню если есть. - `app/services/scrape_pipeline.py` — cian/n1/yandex sweep-функции используют BrowserFetcher. - `app/core/config.py` — `scraper_fetch_mode` для cian/n1/yandex → `browser`. - **Cleanup (после verify):** `cian_session.py` (DMIR cookies), `_avito_proxies` curl_cffi-специфика, `_rotate_ip`/`_is_firewall_page` если больше нигде не нужны. ## Definition of Done (бинарно) - [ ] `/scrape` (или city-sweep) per source cian/n1/yandex через browser → реальные listings (price/area не-NULL), без `banned`. - [ ] cian: больше НЕ требует DMIR_AUTH cookies/warm-up — sweep идёт «из коробки» (разблокирует #843 cian SERP dead). - [ ] yandex: SERP+detail реальные, без captcha-фейлов. - [ ] Старые анти-бот модули удалены ИЛИ за флагом; `grep DMIR_AUTH|_rotate_ip|warm` — только в curl_cffi-fallback ветке. - [ ] `uv run pytest` зелёный (моки fetcher); ruff clean. ## Не делать - НЕ удалять curl_cffi-путь, пока `scraper_fetch_mode=browser` не отработал на проде ≥ неделю (откат). - domclick (#796) — отдельно, не в этой фазе (research, неактивный source). Эпик #883. Depends: Phase 1. Завершает миграцию.
lekss361 added the
scrapers
scope/backend
priority/p2
status/blocked
tradein
labels 2026-05-31 10:37:56 +00:00
Author
Owner

⚠️ Rate-тест: yandex-страницы ~4.2МБ (тяжёлый JS) → camoufox-browser крэшится чаще остальных (TargetClosedError). Для yandex recycle browser агрессивнее — каждые ~8-10 страниц (не 15, как дефолт Phase 0). Плюс transient-retry на старте (первые 1-2 навигации после ротации IP часто ERR/Timeout — прокси прогревается).

⚠️ Rate-тест: yandex-страницы ~4.2МБ (тяжёлый JS) → camoufox-browser крэшится чаще остальных (`TargetClosedError`). Для yandex recycle browser **агрессивнее** — каждые ~8-10 страниц (не 15, как дефолт Phase 0). Плюс transient-retry на старте (первые 1-2 навигации после ротации IP часто ERR/Timeout — прокси прогревается).
Collaborator

Статус 2026-06-26: cian + yandex мигрированы на BrowserFetcher (camoufox), анти-бот костыли сняты — cian без DMIR_AUTH/curl_cffi, _rotate_ip→no-op; yandex SERP/detail/newbuilding через browser. scraper_fetch_mode=browser дефолт, per-provider прокси живы. Остаётся только n1 — scraper-класс так и не построен (low-pri источник; в config/schemas есть упоминания n1.ru, но класса/scheduler-триггера нет). Держу open под n1; cian/yandex-часть done. (Если n1 не нужен — можно закрывать как done.)

Статус 2026-06-26: cian + yandex **мигрированы на BrowserFetcher** (camoufox), анти-бот костыли сняты — cian без DMIR_AUTH/curl_cffi, `_rotate_ip`→no-op; yandex SERP/detail/newbuilding через browser. `scraper_fetch_mode=browser` дефолт, per-provider прокси живы. Остаётся только **n1** — scraper-класс так и не построен (low-pri источник; в config/schemas есть упоминания n1.ru, но класса/scheduler-триггера нет). Держу open под n1; cian/yandex-часть done. (Если n1 не нужен — можно закрывать как done.)
Collaborator

Закрыто (Anton: n1 не нужен) — cian + yandex полностью на BrowserFetcher/camoufox, анти-бот костыли сняты. n1 как источник не строим (low-pri, deprioritized). Phase 2 цель достигнута для актуальных источников.

✅ Закрыто (Anton: n1 не нужен) — cian + yandex полностью на BrowserFetcher/camoufox, анти-бот костыли сняты. n1 как источник не строим (low-pri, deprioritized). Phase 2 цель достигнута для актуальных источников.
Sign in to join this conversation.
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#886
No description provided.