[tradein] Аудит покрытия полей скрапперов avito/cian/yandex — сводка + прод-замер (2026-06-27) #2011

Closed
opened 2026-06-27 16:57:55 +00:00 by lekss361 · 3 comments
Owner

Tracking-issue. Полный аудит того, какие поля листинга реально собираются каждым источником vs скачиваются-но-выбрасываются vs вечно NULL. Метод: глубокий разбор кода (tradein-mvp/backend/app/services/scrapers/*) + живая проверка карточек в браузере (Cian BFF-JSON, Avito detail-DOM, Yandex SERP) + замер fill-rate по проду (ssh gendesign → docker exec tradein-postgres, active listings, 2026-06-27).

Инвентарь (active / enriched)

source n_total n_active enriched% last_scrape
avito 40306 30327 23.5 06-27
cian 17201 15971 4.0 06-26
yandex 9504 7477 5.0 06-27
n1 382 381 0 06-15 (stale)
domklik 30 30 100 06-27

Fill-rate ключевых колонок (active, %)

area living kitchen ceiling year htype repair tfloors cadastr geo descr metro
avito 100 12 25 0 0 0 20 100 0 53 29 0
cian 100 70 4 1 92 56 40 100 0 100 4 94
yandex 100 75 1 1 95 70 2 100 0 100 87 89

Главный вывод — «парсится, но в raw_payload, не в колонках»

kitchen в raw / в колонке ceiling в raw / в колонке
yandex 88% / 1% 88% / 1%
cian 99% / 4% (не дампит)

cian raw_payload также содержит у 99%: mortgage_allowed, is_apartments, is_rosreestr_checked, building_parking, newbuilding_name, has_furniture — всё распарсено, но в колонок не пишется (часть колонок нет вовсе).

Задачи (декомпозиция отчёта)

P1 — дешёвые, высокий ROI (raw_payload → колонки, не зависят от detail-стадии):

  • #2007 — yandex SERP: ceiling_height + kitchen_area_m2 → колонки + нормализация house_type (закрыт 2026-07-03, PR #2016)
  • #2008 — cian SERP: promote kitchen/mortgage + новые is_apartments/is_rosreestr_checked (закрыт 2026-07-03, PR #2017)

P2 — discard на detail/IMV:

  • #2009 — avito detail: дописать house_type + house_catalog_url (+house-level) (закрыт 2026-07-03, PR #2014 + консолидация PR #2340)
  • #2010 — avito IMV: персист comparables + searchSimilarUrl (закрыт 2026-07-03 — прод-объём ниже порога, отложен по собственному DoD-gate)

Уже заведено ранее (production/freshness/geo — не дублирую):

  • #1967 — avito 54% NULL lat → geo-backfill (подтверждено свежим замером: geo 53% active, см. коммент) — ещё открыт
  • #1949 — cian full_load zombie + city_sweep ban → 86% инвентаря stale (закрыт 2026-07-03, PR #2339)
  • #1950 — avito changeip recovery / honest run status (закрыт 2026-07-03 — уже было исправлено ранее, commit 757f6486)
  • #1781 — cian-первичка freshness (needs-human, открыт); #1846 — DomClick мёртв (p3, открыт)

Production-дыры (поле пустое в проде даже при наличии парсера)

  • avito: detail — gated-очередь (23.5% покрытие); anti-bot 403/firewall теряет целые объявления; lat/lon NULL на SERP → 47% без geom.
  • cian: SERP только через camoufox+мобильный прокси; detail curl_cffi требует cian_proxy_url; enriched 4%.
  • yandex: detail-backfill отдельный ночной, зависит от мобильного прокси (enriched 5%); newbuilding-sweep shipped DORMANT; predicted_price NULL для новостроек (ок).

Честные оговорки

  • Кадастр 0% у всех — Cian SERP в ЕКБ не отдаёт cadastralNumber (raw_cadastr тоже 0%) → ограничение источника, не баг.
  • n1 застрял (last_scrape 06-15) — кандидат на отдельный triage.
  • Замер — снимок на 2026-06-27; доли зависят от того, какие стадии (detail/backfill/sweep) включены.

Метод: multi-agent workflow (per-source код-аудит + синтез) + Playwright live-cards + прод SQL.

Tracking-issue. Полный аудит того, какие поля листинга реально собираются каждым источником vs скачиваются-но-выбрасываются vs вечно NULL. Метод: глубокий разбор кода (`tradein-mvp/backend/app/services/scrapers/*`) + живая проверка карточек в браузере (Cian BFF-JSON, Avito detail-DOM, Yandex SERP) + **замер fill-rate по проду** (`ssh gendesign → docker exec tradein-postgres`, active listings, 2026-06-27). ## Инвентарь (active / enriched) | source | n_total | n_active | enriched% | last_scrape | |---|--:|--:|--:|--| | avito | 40306 | 30327 | 23.5 | 06-27 | | cian | 17201 | 15971 | 4.0 | 06-26 | | yandex | 9504 | 7477 | 5.0 | 06-27 | | n1 | 382 | 381 | 0 | **06-15 (stale)** | | domklik | 30 | 30 | 100 | 06-27 | ## Fill-rate ключевых колонок (active, %) | | area | living | kitchen | ceiling | year | htype | repair | tfloors | cadastr | geo | descr | metro | |---|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:| | avito | 100 | 12 | 25 | **0** | **0** | **0** | 20 | 100 | 0 | **53** | 29 | **0** | | cian | 100 | 70 | **4** | 1 | 92 | 56 | 40 | 100 | 0 | 100 | **4** | 94 | | yandex | 100 | 75 | **1** | **1** | 95 | 70 | **2** | 100 | 0 | 100 | 87 | 89 | ## Главный вывод — «парсится, но в raw_payload, не в колонках» | | kitchen в raw / в колонке | ceiling в raw / в колонке | |---|---|---| | yandex | **88% / 1%** | **88% / 1%** | | cian | **99% / 4%** | (не дампит) | cian raw_payload также содержит у **99%**: `mortgage_allowed`, `is_apartments`, `is_rosreestr_checked`, `building_parking`, `newbuilding_name`, `has_furniture` — всё распарсено, но в колонок не пишется (часть колонок нет вовсе). ## Задачи (декомпозиция отчёта) **P1 — дешёвые, высокий ROI (raw_payload → колонки, не зависят от detail-стадии):** - [x] #2007 — yandex SERP: ceiling_height + kitchen_area_m2 → колонки + нормализация house_type (закрыт 2026-07-03, PR #2016) - [x] #2008 — cian SERP: promote kitchen/mortgage + новые is_apartments/is_rosreestr_checked (закрыт 2026-07-03, PR #2017) **P2 — discard на detail/IMV:** - [x] #2009 — avito detail: дописать house_type + house_catalog_url (+house-level) (закрыт 2026-07-03, PR #2014 + консолидация PR #2340) - [x] #2010 — avito IMV: персист comparables + searchSimilarUrl (закрыт 2026-07-03 — прод-объём ниже порога, отложен по собственному DoD-gate) **Уже заведено ранее (production/freshness/geo — не дублирую):** - #1967 — avito 54% NULL lat → geo-backfill (подтверждено свежим замером: geo 53% active, см. коммент) — ещё открыт - #1949 — cian full_load zombie + city_sweep ban → 86% инвентаря stale (закрыт 2026-07-03, PR #2339) - #1950 — avito changeip recovery / honest run status (закрыт 2026-07-03 — уже было исправлено ранее, commit 757f6486) - #1781 — cian-первичка freshness (needs-human, открыт); #1846 — DomClick мёртв (p3, открыт) ## Production-дыры (поле пустое в проде даже при наличии парсера) - **avito:** detail — gated-очередь (23.5% покрытие); anti-bot 403/firewall теряет целые объявления; lat/lon NULL на SERP → 47% без geom. - **cian:** SERP только через camoufox+мобильный прокси; detail curl_cffi требует `cian_proxy_url`; enriched 4%. - **yandex:** detail-backfill отдельный ночной, зависит от мобильного прокси (enriched 5%); newbuilding-sweep shipped DORMANT; predicted_price NULL для новостроек (ок). ## Честные оговорки - Кадастр 0% у всех — Cian SERP в ЕКБ не отдаёт `cadastralNumber` (raw_cadastr тоже 0%) → ограничение источника, не баг. - n1 застрял (last_scrape 06-15) — кандидат на отдельный triage. - Замер — снимок на 2026-06-27; доли зависят от того, какие стадии (detail/backfill/sweep) включены. Метод: multi-agent workflow (per-source код-аудит + синтез) + Playwright live-cards + прод SQL.
lekss361 added the
analytics
data
priority/p1
scrapers
tradein
labels 2026-06-27 16:58:08 +00:00
Author
Owner

Прогресс по декомпозиции (2026-06-27, автономная сессия)

# Что Статус
#2007 yandex house_type норм + kitchen/ceiling promote merged (PR #2016) + deployed + verified. house_type: 0 SCREAMING / 0 other100% канон (миграция 140 применена, замер в #2007). kitchen/ceiling растут по новым скрейпам.
#2009 avito detail house_type + house_catalog_url merged (PR #2014) + deployed. Растёт по detail-enrich (потолок ~29%).
#2008 cian promote + house_type норм 🔄 backend-engineer пишет (PR скоро; зависел от общего base.py+normalizer из #2007)
#2010 avito IMV comparables ⏸️ defer — IMV почти не гоняется (16 записей всего, last 06-24; см. коммент в #2010)

Переоценка по факту кода + прод-замера (честные тела #2007/#2008 переписаны):

  • Реальный импакт на ОЦЕНКУ даёт только нормализация house_type (estimator soft-penalty 3905-3925/4026-4047). kitchen_area_m2/ceiling_height/mortgage_available/is_apartments estimator НЕ читает → промоут для дашборда покрытия/матчинга. Подключение их как фич оценки + обязательный backtest → новый #2012.
  • #2013 (NEW): avito year_built = 0%. Прод-замер: источник год не отдаёт (потолок 1.7% через houses-catalog: 515/29101) → defer, НЕ дешёвый p1-фикс (вопреки первоначальному допущению). Год есть у cian 92% / yandex 95%, у avito в ЕКБ нет.
  • cian house_type тоже частично сломан (monolithBrick ≠ канон monolith_brick, 1143 строки) → чинится в #2008 как CLASS A бонус через тот же нормализатор.
## Прогресс по декомпозиции (2026-06-27, автономная сессия) | # | Что | Статус | |---|---|---| | #2007 | yandex house_type норм + kitchen/ceiling promote | ✅ **merged (PR #2016) + deployed + verified**. house_type: 0 SCREAMING / 0 `other` → **100% канон** (миграция 140 применена, замер в #2007). kitchen/ceiling растут по новым скрейпам. | | #2009 | avito detail house_type + house_catalog_url | ✅ **merged (PR #2014) + deployed**. Растёт по detail-enrich (потолок ~29%). | | #2008 | cian promote + house_type норм | 🔄 backend-engineer пишет (PR скоро; зависел от общего base.py+normalizer из #2007) | | #2010 | avito IMV comparables | ⏸️ **defer** — IMV почти не гоняется (16 записей всего, last 06-24; см. коммент в #2010) | **Переоценка по факту кода + прод-замера (честные тела #2007/#2008 переписаны):** - Реальный импакт на ОЦЕНКУ даёт только **нормализация house_type** (estimator soft-penalty 3905-3925/4026-4047). `kitchen_area_m2`/`ceiling_height`/`mortgage_available`/`is_apartments` estimator НЕ читает → промоут для дашборда покрытия/матчинга. Подключение их как фич оценки + **обязательный backtest** → новый **#2012**. - **#2013** (NEW): avito `year_built` = 0%. Прод-замер: источник год **не отдаёт** (потолок 1.7% через houses-catalog: 515/29101) → defer, НЕ дешёвый p1-фикс (вопреки первоначальному допущению). Год есть у cian 92% / yandex 95%, у avito в ЕКБ нет. - cian house_type тоже частично сломан (`monolithBrick` ≠ канон `monolith_brick`, 1143 строки) → чинится в #2008 как CLASS A бонус через тот же нормализатор.
Author
Owner

Завершено (автономная сессия 2026-06-27)

Все 3 кодовых фикса merged + deployed + verified на проде:

  • #2007 yandex (PR #2016 + миграция 140): house_type 0%→100% канон (0 SCREAMING / 0 other).
  • #2009 avito (PR #2014): house_type (норм.) + house_catalog_url→house_url в save_detail_enrichment (растёт по detail-enrich, потолок ~29%).
  • #2008 cian (PR #2017 + миграция 141): house_type 100% канон (camelCase 0) + новые колонки is_apartments/is_rosreestr_checked.

house_type теперь каноничен у ВСЕХ 3 источников → estimator soft-penalty работает корректно. Раньше ложно штрафовались ~6100 аналогов (≈4900 yandex SCREAMING + ≈1208 cian camelCase), которые НИКОГДА не матчили target.

  • #2013 (A2 avito year_built): задокументирован + defer — источник год не отдаёт (потолок 1.7%).
  • #2010 (IMV): defer — почти не гоняется (16 записей).
  • #2012 (follow-up): подключить kitchen/ceiling/house_type как фичи estimator comp-scoring + обязательный backtest.

CLASS B promote (kitchen/ceiling/mortgage/apartments) задеплоен, fill растёт по новым скрейпам — это дашборд/матчинг, НЕ valuation (до #2012). Knowledge → vault decisions/Decision_Estimator_House_Type_Canon_Promote_Not_Valuation.md.

## ✅ Завершено (автономная сессия 2026-06-27) Все 3 кодовых фикса **merged + deployed + verified на проде**: - **#2007** yandex (PR #2016 + миграция 140): house_type **0%→100% канон** (0 SCREAMING / 0 `other`). - **#2009** avito (PR #2014): house_type (норм.) + house_catalog_url→house_url в `save_detail_enrichment` (растёт по detail-enrich, потолок ~29%). - **#2008** cian (PR #2017 + миграция 141): house_type **100% канон** (camelCase 0) + новые колонки `is_apartments`/`is_rosreestr_checked`. **house_type теперь каноничен у ВСЕХ 3 источников** → estimator soft-penalty работает корректно. Раньше ложно штрафовались ~**6100 аналогов** (≈4900 yandex SCREAMING + ≈1208 cian camelCase), которые НИКОГДА не матчили target. - **#2013** (A2 avito year_built): задокументирован + **defer** — источник год не отдаёт (потолок 1.7%). - **#2010** (IMV): **defer** — почти не гоняется (16 записей). - **#2012** (follow-up): подключить kitchen/ceiling/house_type как фичи estimator comp-scoring + обязательный backtest. CLASS B promote (kitchen/ceiling/mortgage/apartments) задеплоен, fill растёт по новым скрейпам — это дашборд/матчинг, НЕ valuation (до #2012). Knowledge → vault `decisions/Decision_Estimator_House_Type_Canon_Promote_Not_Valuation.md`.
Author
Owner

Все 4 пункта собственной декомпозиции этого аудита (#2007/#2008/#2009/#2010) закрыты. Закрываю tracking-issue.

Cross-referenced пункты (#1967, #1781, #1846) — отдельные issues, не дублируются здесь, трекаются сами по себе (#1967 всё ещё открыт и в очереди backlog-прохода).

Все 4 пункта собственной декомпозиции этого аудита (#2007/#2008/#2009/#2010) закрыты. Закрываю tracking-issue. Cross-referenced пункты (#1967, #1781, #1846) — отдельные issues, не дублируются здесь, трекаются сами по себе (#1967 всё ещё открыт и в очереди backlog-прохода).
Sign in to join this conversation.
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#2011
No description provided.