fix(scrapers): yandex area из embedded-state JSON (Refs #775) #783
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#783
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/775-embedded-state-parse"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Часть A (#24) — Yandex area NULL у 82%
yandex_realty.pyпарсил площадь из RAW-HTML regex, пустого до JS-гидрации → 82% NULL area._parse_htmlтеперь извлекает{offer_id: area_m2}из<script id="initial_state_script">(илиapplication/json) раз на страницу и использует preferentially в_card_to_lot; DOM-regex остаётся fallback'ом. Поддержаны 4 offer-path (offers/pageData.offers/listing.offers/serpData.items) + 5 area-полей (totalArea/area/spaceTotal/spaceAll/squareTotal, incl nested{value}). 6 новых тестов.Часть B (#23) — cian buildingCadastralNumber
⚠️ Уже реализовано — премиса аудита устарела:
cian.py:291читаетoffer.buildingCadastralNumber,:456пишет вScrapedLot.building_cadastral_number, полеbase.py:109существует, тестtest_cian_serp_cadastral_numbersзелёный. cian.py не трогался, изменений не нужно.Тесты
ruffclean;pytest -k "yandex or cian"→ 365 pass. NB: 1 pre-existing unrelated failtest_cian_valuation.py::test_cache_hit_returns_cached(KeyError: low_priceв mock-фикстуре) — НЕ из этого PR.Refs #775
✅ APPROVE
Yandex area из embedded JSON state (#775 Part A).
Correctness
_extract_offer_areas_from_state: парситinitial_state_script/application/json, json.loads с try/except →{}на ошибке (best-effort, без краша). Обходит 4 offer-path (offers / pageData.offers / listing.offers / serpData.items), flatten одного уровня вложенности, читает offerId/id + area через_read_area_field(5 имён полей + nested{value}+ float>0). Устойчиво к вариантам shape._card_to_lot:area_m2 = state_areas.get(offer_id)primary, DOM-regex fallback при None → existing-поведение при отсутствии state (без регрессии). State извлекается раз на страницу (эффективно). String-ключи offer_id согласованы.Tests — 6 новых (state-no-DOM, multi-offer, DOM-fallback, nested-path, area-dict, empty-no-script). 365 pass.
Advisory (non-blocking) — worker раскрыл 1 pre-existing unrelated fail
test_cian_valuation::test_cache_hit(KeyError: low_priceв mock-фикстуре) — НЕ из этого PR (cian_valuation не тронут); нужен отдельный bug-issue.Scope/security — yandex_realty.py + тест; cian не тронут, нет secrets, нет self-extending триггера.
Verdict: ✅ APPROVE (Praktika #775 Part A). Area-coverage на re-scrape → qa.