fix(tradein): working cian ЖК-url resolver → unblock #972 backfill #1161

Merged
bot-backend merged 1 commit from feat/cian-zhk-resolve-972 into main 2026-06-08 06:13:41 +00:00
Collaborator

Что

Чинит резолв cian ЖК-url → разблокирует #972 backfill (он матчил 0 домов). Корень: старый resolve_cian_zhk_url бил в /zhk/<id>/ → теперь 404; 318 geo-matched cian-домов (ext_id есть, cian_zhk_url NULL) были нефетчабельны.

Резолв (проверен на проде)

resolve_cian_zhk_url_via_search(nb_id)cat.php?newobject[0]=<nb_id> SERP (curl_cffi) → канон" zhk-slug-url. Цепочка nb_id → SERP → zhk-slug → fetch_newbuilding → enrich работает.

Безопасность резолва (gating-фикс от ревью)

Извлечение заякорено на <h1 data-name="Title"> (не наивный first-match): на реальном 2.81MB SERP есть 40 banner + 7 suggest-блоков ДО заголовка → промо/«похожие ЖК» zhk-* ссылки могли резолвить ЧУЖОЙ ЖК → тихая порча enrichment (idempotency залочила бы). Проверено на живом SERP + adversarial-тест (poisoned recommendation до title → возвращается target, не чужой).

Backfill-проводка

fetchable расширен на (cian_zhk_url OR ext_id); per-house resolve→persist url под SAVEPOINT→enrich; rate-limited, resumable, idempotent (resolved-но-не-enriched резюмится; fully-enriched скипается, без дублей/ре-фетча).

Проба (bounded, 5 домов, direct)

5/5 url резолвнуты+персиснуты, 3/5 полностью обогащены (+18 price_dynamics, +3 reliability). 2 промаха — direct-mode anti-bot на 2-м фетче.

Качество

  • code-reviewer: SQL/идемпотентность/no-regression + резолвер заякорен против wrong-ЖК (после ревью-фикса). 19 тестов зелёные, ruff чисто. NON-colliding (tradein cian-скрейперы; Леха в gendesign ИРД).

⚠️ Полный 318-прогон — gated на прокси

cian-прокси mproxy.site сейчас ЛЕЖИТ (connection refused) — это ломает и обычный cian-sweep. Direct работает для одиночных фетчей, но 318×2 на скейле упрётся в anti-bot. Полный backfill = после восстановления прокси.

Refs #972.

## Что Чинит резолв cian ЖК-url → **разблокирует #972 backfill** (он матчил 0 домов). Корень: старый `resolve_cian_zhk_url` бил в `/zhk/<id>/` → теперь **404**; 318 geo-matched cian-домов (`ext_id` есть, `cian_zhk_url` NULL) были нефетчабельны. ## Резолв (проверен на проде) `resolve_cian_zhk_url_via_search(nb_id)` → `cat.php?newobject[0]=<nb_id>` SERP (curl_cffi) → канон" zhk-slug-url. Цепочка `nb_id → SERP → zhk-slug → fetch_newbuilding → enrich` работает. ## Безопасность резолва (gating-фикс от ревью) Извлечение **заякорено на `<h1 data-name="Title">`** (не наивный first-match): на реальном 2.81MB SERP есть 40 banner + 7 suggest-блоков ДО заголовка → промо/«похожие ЖК» `zhk-*` ссылки могли резолвить ЧУЖОЙ ЖК → тихая порча enrichment (idempotency залочила бы). Проверено на живом SERP + adversarial-тест (poisoned recommendation до title → возвращается target, не чужой). ## Backfill-проводка `fetchable` расширен на `(cian_zhk_url OR ext_id)`; per-house resolve→persist url под SAVEPOINT→enrich; rate-limited, resumable, idempotent (resolved-но-не-enriched резюмится; fully-enriched скипается, без дублей/ре-фетча). ## Проба (bounded, 5 домов, direct) 5/5 url резолвнуты+персиснуты, 3/5 полностью обогащены (+18 price_dynamics, +3 reliability). 2 промаха — direct-mode anti-bot на 2-м фетче. ## Качество - `code-reviewer`: ✅ SQL/идемпотентность/no-regression + резолвер заякорен против wrong-ЖК (после ревью-фикса). **19 тестов** зелёные, ruff чисто. NON-colliding (tradein cian-скрейперы; Леха в gendesign ИРД). ## ⚠️ Полный 318-прогон — gated на прокси cian-прокси `mproxy.site` сейчас **ЛЕЖИТ** (connection refused) — это ломает и обычный cian-sweep. Direct работает для одиночных фетчей, но 318×2 на скейле упрётся в anti-bot. Полный backfill = после восстановления прокси. Refs #972.
bot-backend added the
scope/backend
scrapers
GG-форсайт
site-finder
labels 2026-06-08 06:13:38 +00:00
bot-backend added 1 commit 2026-06-08 06:13:39 +00:00
fix(tradein): working cian ЖК-url resolver via cat.php SERP (#972)
All checks were successful
CI / changes (push) Successful in 6s
CI / backend-tests (push) Has been skipped
CI / frontend-tests (push) Has been skipped
CI / changes (pull_request) Successful in 5s
Deploy Trade-In / test (push) Successful in 31s
Deploy Trade-In / build-backend (push) Successful in 1m20s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
Deploy Trade-In / changes (push) Successful in 5s
Deploy Trade-In / build-frontend (push) Has been skipped
Deploy Trade-In / build-browser (push) Has been skipped
Deploy Trade-In / deploy (push) Successful in 46s
b0fe292a63
The legacy resolve_cian_zhk_url hit /zhk/<id>/ which now 404s, leaving the
318 geo-matched cian houses (house_sources.ext_id set, cian_zhk_url NULL)
unfetchable -> the newbuilding-enrichment backfill matched 0 houses.

Add resolve_cian_zhk_url_via_search(nb_id): fetch the cat.php newbuilding SERP
and extract the canonical zhk-<slug>.cian.ru url, ANCHORED on the
<h1 data-name="Title"> header anchor (NOT naive first-match — the SERP carries
promo/recommendation zhk-* links before the title that would otherwise resolve
the wrong ЖК and silently corrupt enrichment). Validated against the real
2.81MB prod SERP + an adversarial poisoned-recommendation test.

Wire into newbuilding_enrich_backfill: broaden selection to "has ext_id OR
cian_zhk_url", resolve+persist the url under a SAVEPOINT before enriching,
rate-limited + resumable + idempotent. Keep the old resolver (deprecated).

Bounded prod proof (5 houses, direct): 5/5 urls resolved+persisted, 3/5 fully
enriched (+18 price_dynamics, +3 reliability); the 2 misses were direct-mode
anti-bot on the 2nd fetch. Full 318-run gated on the cian mobile proxy
(mproxy.site) being restored. code-reviewer APPROVE (SQL/idempotency) +
resolver hardened against wrong-ЖК. 19 tests green.

Refs #972.
bot-backend merged commit b0fe292a63 into main 2026-06-08 06:13:41 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
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#1161
No description provided.