[tradein][avito] detail: дописать house_type + house_catalog_url (+5 house-level полей) в save_detail_enrichment #2009

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

Из аудита покрытия полей скрапперов 2026-06-27 (код + живой замер прода). parse_detail_html парсит 7 house-level полей, но save_detail_enrichment их явно опускает (docstring avito_detail.py:680-681) → данные выбрасываются.

Прод-замер (active avito, 2026-06-27)

  • house_type заполнен у 0% avito-листингов (хотя detail-страница его отдаёт — «Тип дома: монолитный/панельный», подтверждено живьём на avito.ru).
  • detail-enriched = 23.5% (9456/40306) — даже у обогащённых house_type не пишется.

Что парсится, но не сохраняется (file:line)

avito_detail.py:479-487,526-531,568-581,652-658 → поля DetailEnrichment:

  • house_type (Тип дома) — закрывает вечный NULL listings.house_type для avito
  • house_catalog_url (/catalog/houses/...) — линковка дома сейчас падает на SERP house_ext_id, который NULL у части карточек
  • total_floors_house, passenger_elevators, cargo_elevators, has_concierge, closed_yard

(живьём на detail-карточках подтверждены: «Тип дома», «Этажей в доме», «Пассажирский/Грузовой лифт», «Двор»)

DoD

  • В save_detail_enrichment (avito_detail.py:675-718) добавить в UPDATE как минимум house_type и house_catalog_url (приоритет), затем лифты/консьерж/двор.
  • house_type — прогнать через нормализатор (panel/brick/monolith/monolith_brick), как у cian.
  • Для лифтов/консьержа/двора — проверить, есть ли колонки в listings/houses; если нет — отдельная мелкая миграция или писать в houses-запись (через avito_houses). Если решение неочевидно — реализовать только house_type+house_catalog_url, остальное вынести в follow-up.
  • Замер до/после: house_type fill-rate active avito с 0% → доля обогащённых (~23%+, растёт по мере detail-backfill).

⚠️ Эффект ограничен охватом detail-стадии (23.5%); полное закрытие зависит от стабильности detail-очереди (смежно #1950). Но дописать сохранение надо — сейчас даже обогащённые строки теряют house_type.

scope/backend, scrapers, tradein, priority/p2.

Из аудита покрытия полей скрапперов 2026-06-27 (код + живой замер прода). `parse_detail_html` парсит 7 house-level полей, но `save_detail_enrichment` их **явно опускает** (docstring `avito_detail.py:680-681`) → данные выбрасываются. ## Прод-замер (active avito, 2026-06-27) - `house_type` заполнен у **0%** avito-листингов (хотя detail-страница его отдаёт — «Тип дома: монолитный/панельный», подтверждено живьём на `avito.ru`). - detail-enriched = 23.5% (9456/40306) — даже у обогащённых house_type не пишется. ## Что парсится, но не сохраняется (file:line) `avito_detail.py:479-487,526-531,568-581,652-658` → поля `DetailEnrichment`: - `house_type` (Тип дома) — закрывает вечный NULL `listings.house_type` для avito - `house_catalog_url` (`/catalog/houses/...`) — линковка дома сейчас падает на SERP `house_ext_id`, который NULL у части карточек - `total_floors_house`, `passenger_elevators`, `cargo_elevators`, `has_concierge`, `closed_yard` (живьём на detail-карточках подтверждены: «Тип дома», «Этажей в доме», «Пассажирский/Грузовой лифт», «Двор») ## DoD - В `save_detail_enrichment` (`avito_detail.py:675-718`) добавить в UPDATE как минимум `house_type` и `house_catalog_url` (приоритет), затем лифты/консьерж/двор. - `house_type` — прогнать через нормализатор (`panel/brick/monolith/monolith_brick`), как у cian. - Для лифтов/консьержа/двора — проверить, есть ли колонки в `listings`/`houses`; если нет — отдельная мелкая миграция или писать в `houses`-запись (через avito_houses). Если решение неочевидно — реализовать только house_type+house_catalog_url, остальное вынести в follow-up. - **Замер до/после**: `house_type` fill-rate active avito с 0% → доля обогащённых (~23%+, растёт по мере detail-backfill). ⚠️ Эффект ограничен охватом detail-стадии (23.5%); полное закрытие зависит от стабильности detail-очереди (смежно #1950). Но дописать сохранение надо — сейчас даже обогащённые строки теряют house_type. scope/backend, scrapers, tradein, priority/p2.
lekss361 added the
priority/p2
scope/backend
scrapers
status/ready
tradein
labels 2026-06-27 16:58:06 +00:00
Author
Owner

Working on this in PR #2014 (house_type + house_catalog_url→house_url в save_detail_enrichment; миграция не нужна — обе колонки существуют). code-reviewer APPROVE.

Working on this in PR #2014 (house_type + house_catalog_url→house_url в save_detail_enrichment; миграция не нужна — обе колонки существуют). code-reviewer ✅ APPROVE.
Author
Owner

Живой пост-деплой тест (3 detail-обогащения центральных ЕКБ-квартир через /admin/scrape/avito-detail):

  • Фикс работает: house_url (←house_catalog_url) заполнился на всех 3 (avito.ru/catalog/houses/...) — раньше save_detail_enrichment его дропал. kitchen/ceiling/living/repair/mortgage тоже сохраняются.
  • ⚠️ Поправка к ожиданиям по house_type: на всех 3 detail-карточках house_type оказался пустым — у avito в ЕКБ «Тип дома» часто не заполнен продавцом даже на detail-странице. Т.е. реальное покрытие avito house_type будет заметно ниже потолка detail-стадии (~29%) — фикс корректно пишет значение КОГДА оно есть, но источник его отдаёт нечасто. SERP его не отдаёт вовсе (свежий замер: avito SERP = только rooms/area/floor/tfloors/price/address, даже без lat/lon).

Фикс остаётся валидным (персист house_type+house_url, COALESCE), просто эффект по house_type меньше, чем казалось из аудита. Полное закрытие зависит от стабильности detail-очереди (#1950) и от самих данных avito.

Живой пост-деплой тест (3 detail-обогащения центральных ЕКБ-квартир через `/admin/scrape/avito-detail`): - ✅ **Фикс работает:** `house_url` (←house_catalog_url) заполнился на всех 3 (`avito.ru/catalog/houses/...`) — раньше `save_detail_enrichment` его дропал. kitchen/ceiling/living/repair/mortgage тоже сохраняются. - ⚠️ **Поправка к ожиданиям по `house_type`:** на всех 3 detail-карточках `house_type` оказался **пустым** — у avito в ЕКБ «Тип дома» часто не заполнен продавцом даже на detail-странице. Т.е. реальное покрытие avito `house_type` будет **заметно ниже** потолка detail-стадии (~29%) — фикс корректно пишет значение КОГДА оно есть, но источник его отдаёт нечасто. SERP его не отдаёт вовсе (свежий замер: avito SERP = только rooms/area/floor/tfloors/price/address, даже без lat/lon). Фикс остаётся валидным (персист house_type+house_url, COALESCE), просто эффект по house_type меньше, чем казалось из аудита. Полное закрытие зависит от стабильности detail-очереди (#1950) и от самих данных avito.
Author
Owner

Working on this (автономный проход по backlog) — ветка fix/tradein-avito-detail-house-fields, параллельно с #2007/#2010/#1949 (разные файлы, независимо).

Working on this (автономный проход по backlog) — ветка `fix/tradein-avito-detail-house-fields`, параллельно с #2007/#2010/#1949 (разные файлы, независимо).
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#2009
No description provided.