fix(scrapers): avito_houses — отзывы/история/тип ЖК долетают (виджет-payload вложен глубже) (#1789) #1797

Merged
lekss361 merged 1 commit from feat/avito-houses-mfe-state into main 2026-06-19 16:27:03 +00:00
Owner

Closes #1789.

Корневая причина (уточнена против issue по живой фикстуре)

Issue предполагал переезд данных в отдельный __mfe__ payload. Фактически: __preloadedState__ остался на месте (percent-encoded, декодится unquote+json.loads), но Avito (MFE-рефактор) вложил payload каждого виджета на уровень глубже — под ключ с именем виджета:

виджет было стало
reviews props.entries props.reviews.entries
miniSerp props.items props.miniSerp.items
housePlacementHistory props.items props.housePlacementHistory.items
recommendations props.items props.recommendations.items
housePage без изменений (поэтому type/year парсились)

house_type/year_built работали, а reviews/placement/miniSerp давали 0 → house_reviews=0, placement(avito_widget)=0, avito_validated_at=NULL у всех.

Фикс

  • Хелпер _widget_payload(widget, type) — разворачивает props[type] с fallback на props (обратная совместимость).
  • _parse_reviews/_parse_mini_serp/_parse_placement_history/_parse_recommendations переведены на него.
  • UPSERT houses: добавлен avito_validated_at = NOW() (колонка была в схеме 040_houses_extend.sql, но никогда не писалась).
  • Guard: виджет найден, но 0 entries → logger.warning.

Тест (фикстура avito_house_572538.html, реальный дом)

reviews 3, placement 8, miniSerp 2, recommendations 14, house_type=brick, year=1994, reviews_count=3. 23 passed.

NB: rating_score для этого дома легитимно None (scoreString="—", нет агрегатной оценки при 3 отзывах) — путь ratingPreview корректен, для домов со сводным баллом долетит.

На ревью

  • _widget_payload fallback (props[type] → props) — не маскирует ли реально-пустые виджеты.
  • Фикстура урезана до 227KB (pre-commit limit 512) — оставлен state["data"], все 9 виджетов парсятся.
  • avito_validated_at=NOW() ставится только на успешном парсе.
Closes #1789. ## Корневая причина (уточнена против issue по живой фикстуре) Issue предполагал переезд данных в отдельный `__mfe__` payload. **Фактически:** `__preloadedState__` остался на месте (percent-encoded, декодится `unquote`+`json.loads`), но Avito (MFE-рефактор) вложил payload каждого виджета **на уровень глубже** — под ключ с именем виджета: | виджет | было | стало | |---|---|---| | reviews | `props.entries` | `props.reviews.entries` | | miniSerp | `props.items` | `props.miniSerp.items` | | housePlacementHistory | `props.items` | `props.housePlacementHistory.items` | | recommendations | `props.items` | `props.recommendations.items` | | housePage | — | без изменений (поэтому type/year парсились) | → `house_type`/`year_built` работали, а reviews/placement/miniSerp давали 0 → `house_reviews`=0, placement(avito_widget)=0, `avito_validated_at`=NULL у всех. ## Фикс - Хелпер `_widget_payload(widget, type)` — разворачивает `props[type]` с fallback на `props` (обратная совместимость). - `_parse_reviews`/`_parse_mini_serp`/`_parse_placement_history`/`_parse_recommendations` переведены на него. - UPSERT `houses`: добавлен `avito_validated_at = NOW()` (колонка была в схеме `040_houses_extend.sql`, но никогда не писалась). - Guard: виджет найден, но 0 entries → `logger.warning`. ## Тест (фикстура avito_house_572538.html, реальный дом) reviews **3**, placement **8**, miniSerp **2**, recommendations **14**, house_type=brick, year=1994, reviews_count=3. **23 passed**. NB: `rating_score` для этого дома легитимно None (`scoreString="—"`, нет агрегатной оценки при 3 отзывах) — путь `ratingPreview` корректен, для домов со сводным баллом долетит. ## На ревью - `_widget_payload` fallback (props[type] → props) — не маскирует ли реально-пустые виджеты. - Фикстура урезана до 227KB (pre-commit limit 512) — оставлен `state["data"]`, все 9 виджетов парсятся. - `avito_validated_at=NOW()` ставится только на успешном парсе.
lekss361 added 1 commit 2026-06-19 16:22:59 +00:00
fix(scrapers): avito_houses читает MFE props-вложенность виджетов — отзывы/история/тип ЖК теперь долетают (#1789)
All checks were successful
CI / changes (pull_request) Successful in 5s
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
464e9faf7b
lekss361 merged commit 059fa83589 into main 2026-06-19 16:27:03 +00:00
lekss361 deleted branch feat/avito-houses-mfe-state 2026-06-19 16:27:04 +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#1797
No description provided.