feat(tradein/domclick): обогащение Layer A поиска — description, repair-инференс, minhash, seller #1999

Merged
lekss361 merged 1 commit from feat/tradein-domclick-search-enrich into main 2026-06-27 13:37:13 +00:00
Owner

Что

Расширяет рабочий Layer A SERP-скрейпер DomClick (_map_item) полями, которые поисковый API bff-search-web уже отдаёт (проверено живьём на проде). Чисто аддитивно, существующее поведение не меняется.

Добавлено в маппинг оффера → ScrapedLot:

  • descriptionScrapedLot.description + repair_state через infer_repair_state_from_text (у DomClick search нет renovation-enum → выводим из текста, как cian #622: «евроремонт»→good, «без отделки»→needs_repair, «косметический»→standard, «дизайнерский»→excellent; «с ремонтом» без уточнения → None, честный NULL)
  • description_minhash (sha1[:32]) → cross-source дедуп
  • agency_name из seller (defensive: str|dict)
  • raw_payload: is_sber_collateral (залог Сбера), has_discount/discount_value, duplicates_offer_count (спрос), seller — существующие ключи сохранены

Зачем

После live-аудита транспорта (этой сессии): глубокая card-карточка DomClick (renovation-enum, wallType/floorType, livingArea/kitchenArea, полная история цен, owners_count) живёт только на offer-card/card-странице, которая за QRATOR-403 на прод-прокси (mobile/datacenter IP в reputation-блоке; реальная карточка отдаётся только с чистого residential IP). Это отдельный эффорт (нужен dedicated residential proxy).

Но поисковый API (QRATOR-мягкий, уже работает) несёт полезный срез — его и забираем здесь: ремонт (из описания), залог Сбера, скидка, спрос, агентство. Реальный сигнал для estimator без QRATOR-риска.

Тесты

tests/scrapers/test_domclick.py: +9 (description+repair+minhash, strip/None-edge, raw_payload enrichment, agency из dict, no-description-no-crash, preserve-existing-raw_payload). 39 passed, ruff-100 + pre-commit чисто.

Scope

Аддитивно к Layer A. Deep card-detail (Layer B) — отдельным PR при наличии dedicated residential proxy; блокер задокументирован.

## Что Расширяет **рабочий** Layer A SERP-скрейпер DomClick (`_map_item`) полями, которые поисковый API `bff-search-web` уже отдаёт (проверено живьём на проде). Чисто аддитивно, существующее поведение не меняется. Добавлено в маппинг оффера → `ScrapedLot`: - **`description`** → `ScrapedLot.description` + **`repair_state`** через `infer_repair_state_from_text` (у DomClick search нет renovation-enum → выводим из текста, как cian #622: «евроремонт»→good, «без отделки»→needs_repair, «косметический»→standard, «дизайнерский»→excellent; «с ремонтом» без уточнения → None, честный NULL) - **`description_minhash`** (sha1[:32]) → cross-source дедуп - **`agency_name`** из `seller` (defensive: str|dict) - **raw_payload**: `is_sber_collateral` (залог Сбера), `has_discount`/`discount_value`, `duplicates_offer_count` (спрос), `seller` — существующие ключи сохранены ## Зачем После live-аудита транспорта (этой сессии): **глубокая card-карточка DomClick** (renovation-enum, wallType/floorType, livingArea/kitchenArea, полная история цен, owners_count) живёт только на `offer-card`/card-странице, которая **за QRATOR-403 на прод-прокси** (mobile/datacenter IP в reputation-блоке; реальная карточка отдаётся только с чистого residential IP). Это отдельный эффорт (нужен dedicated residential proxy). Но **поисковый API (QRATOR-мягкий, уже работает)** несёт полезный срез — его и забираем здесь: ремонт (из описания), залог Сбера, скидка, спрос, агентство. Реальный сигнал для estimator без QRATOR-риска. ## Тесты `tests/scrapers/test_domclick.py`: +9 (description+repair+minhash, strip/None-edge, raw_payload enrichment, agency из dict, no-description-no-crash, preserve-existing-raw_payload). **39 passed**, ruff-100 + pre-commit чисто. ## Scope Аддитивно к Layer A. Deep card-detail (Layer B) — отдельным PR при наличии dedicated residential proxy; блокер задокументирован.
lekss361 added 1 commit 2026-06-27 13:36:00 +00:00
feat(tradein/domclick): enrich Layer A SERP parser — description, repair-inference, minhash, seller
All checks were successful
CI / changes (pull_request) Successful in 7s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
54a5d13c48
Capture extra bff-search fields in _map_item (verified live):
- description → ScrapedLot.description + infer_repair_state_from_text → repair_state
  (DomClick search has no renovation-enum; text inference like cian #622)
- sha1 description_minhash (cross-source dedup)
- agency_name from seller (defensive str|dict)
- raw_payload: is_sber_collateral, has_discount, discount_value, duplicates_offer_count, seller

Additive only; existing Layer A behavior unchanged. Deep card detail (renovation-enum,
wallType, full price-history, owners_count) is card-only = QRATOR-blocked on prod proxy
→ separate effort (needs dedicated residential IP).
lekss361 merged commit 40b7ca4242 into main 2026-06-27 13:37:13 +00:00
lekss361 deleted branch feat/tradein-domclick-search-enrich 2026-06-27 13:37:14 +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#1999
No description provided.