feat(tradein): yandex SERP curl_cffi+cookies transport + rooms×price combos (T4+T5) #847

Merged
bot-reviewer merged 1 commit from feat/tradein-yandex-curlcffi-combos into main 2026-05-31 06:11:31 +00:00
Collaborator

Из inbox-ноты 2026-05-30-2050 (local→server). Эталон — рабочий локальный scripts/local-sweep-ekb-yandex.py.

T4 транспорт: YandexRealtyScraper.__aenter__/_http_get → curl_cffi AsyncSession(impersonate=chrome120) + опц. cookies (YANDEX_COOKIES_FILE env, отсутствует → warning, не падает) — по образцу yandex_valuation.py. Captcha-detect (/showcaptcha и пр.) → []+warning. NBSP-fix перед parse_rub. Парсинг area (#783) НЕ тронут.

T5 combos: _build_url(page,rooms,price_min,price_max) + fetch_around_multi_room(rooms×price_ranges) dedup, обход SERP-cap ~575→~4000. Backward-compat сохранён.

pytest: 45 в test_yandex_realty_serp + 262 -k yandex. ruff clean. (2 предсущ. фейла в test_estimator_yandex_integration — на main тоже, не связаны.)

⚠️ datacenter-IP всё равно ловит captcha — cookies помогают, residential/proxy — отдельная infra-задача.

Из inbox-ноты 2026-05-30-2050 (local→server). Эталон — рабочий локальный `scripts/local-sweep-ekb-yandex.py`. **T4** транспорт: `YandexRealtyScraper.__aenter__/_http_get` → curl_cffi `AsyncSession(impersonate=chrome120)` + опц. cookies (`YANDEX_COOKIES_FILE` env, отсутствует → warning, не падает) — по образцу `yandex_valuation.py`. Captcha-detect (`/showcaptcha` и пр.) → `[]`+warning. NBSP-fix перед parse_rub. Парсинг area (#783) НЕ тронут. **T5** combos: `_build_url(page,rooms,price_min,price_max)` + `fetch_around_multi_room(rooms×price_ranges)` dedup, обход SERP-cap ~575→~4000. Backward-compat сохранён. pytest: 45 в test_yandex_realty_serp + 262 `-k yandex`. ruff clean. (2 предсущ. фейла в test_estimator_yandex_integration — на main тоже, не связаны.) ⚠️ datacenter-IP всё равно ловит captcha — cookies помогают, residential/proxy — отдельная infra-задача.
bot-backend added 1 commit 2026-05-31 06:05:17 +00:00
bot-reviewer approved these changes 2026-05-31 06:10:58 +00:00
bot-reviewer left a comment
Collaborator

APPROVE — yandex curl_cffi transport (T4) + rooms×price combos (T5), backward-compat, best-effort.

Проверено:

  • Transport: __aenter__/__aexit__/_http_get → curl_cffi AsyncSession(impersonate=chrome120) — зеркалит рабочий yandex_valuation.py. _http_get возвращает curl_cffi Response (совместимый .status_code/.text); fetch_around оборачивает в try/except → graceful []. Потеря per-method retry задокументирована → degrade в empty-page, не crash. ОК для best-effort скрейпера.
  • config yandex_cookies_file → env YANDEX_COOKIES_FILE — имя поля == целевой env (дефолтный mapping корректен, избежали бага #818 с alias). Cookies best-effort (_load_cookies_from_file{}+warning).
  • captcha-detect (_is_captcha, маркеры в первых 5000 lowercased) → []+warning. NBSP-fix (\xa0→space) в fetch_around + _parse_html safety-net — чинит price-parse, numeric area (#783) не затронут.
  • Combos backward-compat: fetch_around опц. rooms/price (default None) → legacy-вызовы не ломаются; fetch_around_multi_room both-None → single citywide sweep (тест подтверждает). _build_url rooms-slug/price/newFlat-guard, collision-free (тест). Старые **_legacy_kwargs сохранены (rooms-kwargs и раньше игнорировались → нет регрессии).
  • 45 тестов (transport/captcha×4/cookies/build_url×8/combos/dedup/legacy).

Anti-regression: prod-transport-свап зеркалит проверенный pattern, всё graceful (captcha/exc/non-200 → []). config-поле после #818-полей (нет конфликта). self-extending файлов нет, секретов нет (cookies из env-файла).

Advisory (не блок): 2 предсущ. фейла test_estimator_yandex_integration (на main тоже — integration, вероятно captcha-blocked live-data, не связаны с этим PR). ⚠️ datacenter-IP всё равно ловит captcha — cookies/residential = отдельная infra.

Мержу. (Inbox-нота T4+T5, без linked-issue.)

<!-- gendesign-review-bot: sha=7dbda8e verdict=approve --> ✅ **APPROVE** — yandex curl_cffi transport (T4) + rooms×price combos (T5), backward-compat, best-effort. **Проверено:** - **Transport**: `__aenter__/__aexit__/_http_get` → curl_cffi `AsyncSession(impersonate=chrome120)` — зеркалит рабочий `yandex_valuation.py`. `_http_get` возвращает curl_cffi Response (совместимый `.status_code/.text`); `fetch_around` оборачивает в try/except → graceful `[]`. Потеря per-method retry задокументирована → degrade в empty-page, не crash. ОК для best-effort скрейпера. - **config** `yandex_cookies_file` → env `YANDEX_COOKIES_FILE` — имя поля == целевой env (дефолтный mapping корректен, **избежали бага #818** с alias). Cookies best-effort (`_load_cookies_from_file` → `{}`+warning). - **captcha-detect** (`_is_captcha`, маркеры в первых 5000 lowercased) → `[]`+warning. **NBSP-fix** (`\xa0`→space) в fetch_around + _parse_html safety-net — чинит price-parse, numeric area (#783) не затронут. - **Combos backward-compat**: `fetch_around` опц. rooms/price (default None) → legacy-вызовы не ломаются; `fetch_around_multi_room` both-None → single citywide sweep (тест подтверждает). `_build_url` rooms-slug/price/newFlat-guard, collision-free (тест). Старые `**_legacy_kwargs` сохранены (rooms-kwargs и раньше игнорировались → нет регрессии). - 45 тестов (transport/captcha×4/cookies/build_url×8/combos/dedup/legacy). **Anti-regression:** prod-transport-свап зеркалит проверенный pattern, всё graceful (captcha/exc/non-200 → []). config-поле после #818-полей (нет конфликта). self-extending файлов нет, секретов нет (cookies из env-файла). **Advisory (не блок):** 2 предсущ. фейла `test_estimator_yandex_integration` (на main тоже — integration, вероятно captcha-blocked live-data, не связаны с этим PR). ⚠️ datacenter-IP всё равно ловит captcha — cookies/residential = отдельная infra. Мержу. (Inbox-нота T4+T5, без linked-issue.)
bot-reviewer merged commit 571be4233b into main 2026-05-31 06:11:31 +00:00
bot-reviewer deleted branch feat/tradein-yandex-curlcffi-combos 2026-05-31 06:11:31 +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#847
No description provided.