domrf_catalog status: классификация по первому ключевому слову во всём HTML + 'продано'≠'продана' → sold помечается free #1609

Closed
opened 2026-06-16 17:19:48 +00:00 by bot-backend · 0 comments
Collaborator

Severity: medium · Категория: wrong-result · Файл: backend/app/services/scrapers/domrf_catalog.py:271-283

Файл: backend/app/services/scrapers/domrf_catalog.py:271-283. Регекс статуса ищет первое из ('в продаже|свободна|free|продано|sold|забронирована|бронь|reserved') во ВСЁМ HTML без привязки к статусу конкретной квартиры. Два дефекта: (1) 'в продаже' часто в навигации / блоке 'другие квартиры в продаже' → ложный free; (2) паттерн содержит 'продано' (ср.р.), но типовая 'Квартира продана' (ж.р.) не матчится. Воспроизведено: 'Квартира продана. Другие квартиры в продаже.' → group(1)='в продаже' → status=STATUS_FREE для проданной. status пишется через COALESCE (строка 417), используется для оценки доступного предложения → инверсия sold→free завышает supply и искажает forecasting. Фикс: (а) добавить морфоварианты 'продан[ао]?', 'забронирован[ао]?'; (б) якорить к статус-бейджу через blocks или NEXT_DATA JSON; (в) исключить секции 'похожие/другие квартиры'.

Почему баг: status пишется через COALESCE в БД и используется для оценки доступного предложения. Инверсия sold→free завышает доступное предложение по объекту и искажает forecasting спроса/предложения.

Как чинить: Якорить статус к бейджу/блоку статуса конкретной квартиры (через _find_text_near от лейбла 'Статус'/класс badge), а не по всему документу. Расширить паттерн на 'продан(а|о)', 'забронирован(а)'. Приоритизировать sold/reserved над free при множественных совпадениях.


deep-audit backend v2 (после PR #1543) · verify+harden, confidence 0.78 · unit B33

**Severity:** medium · **Категория:** wrong-result · **Файл:** `backend/app/services/scrapers/domrf_catalog.py:271-283` Файл: backend/app/services/scrapers/domrf_catalog.py:271-283. Регекс статуса ищет первое из ('в продаже|свободна|free|продано|sold|забронирована|бронь|reserved') во ВСЁМ HTML без привязки к статусу конкретной квартиры. Два дефекта: (1) 'в продаже' часто в навигации / блоке 'другие квартиры в продаже' → ложный free; (2) паттерн содержит 'продано' (ср.р.), но типовая 'Квартира продана' (ж.р.) не матчится. Воспроизведено: 'Квартира продана. Другие квартиры в продаже.' → group(1)='в продаже' → status=STATUS_FREE для проданной. status пишется через COALESCE (строка 417), используется для оценки доступного предложения → инверсия sold→free завышает supply и искажает forecasting. Фикс: (а) добавить морфоварианты 'продан[ао]?', 'забронирован[ао]?'; (б) якорить к статус-бейджу через blocks или __NEXT_DATA__ JSON; (в) исключить секции 'похожие/другие квартиры'. **Почему баг:** status пишется через COALESCE в БД и используется для оценки доступного предложения. Инверсия sold→free завышает доступное предложение по объекту и искажает forecasting спроса/предложения. **Как чинить:** Якорить статус к бейджу/блоку статуса конкретной квартиры (через _find_text_near от лейбла 'Статус'/класс badge), а не по всему документу. Расширить паттерн на 'продан(а|о)', 'забронирован(а)'. Приоритизировать sold/reserved над free при множественных совпадениях. --- <sub>deep-audit backend v2 (после PR #1543) · verify+harden, confidence 0.78 · unit B33</sub>
bot-backend added the
week ревью 1
label 2026-06-16 17:19:48 +00:00
bot-backend added the
needs-human
label 2026-06-16 20:44:16 +00:00
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#1609
No description provided.