lekss361
25b73035a1
sprint1: nspd scraper industrialization, per-bucket elasticity, cadastre cross-check, sentry releases
...
- NSPD-skraper переехал в backend/app/services/scrapers/nspd_kn.py +
Celery task scrape_nspd_region (beat: 20-е февраля/мая/авг/нояб).
Redis lock 3h, WAF auto-retry, heartbeat в nspd_scrape_runs.
- Recommend_mix Tier 3: per-bucket elasticity через регрессию по
«доминирующему bucket» каждого ЖК. Weighted-elasticity для inverse-mode.
UI показывает разброс эластичностей и переключение regression/fallback.
- Cadastre vs market cross-check: spatial-join cad_buildings →
ekb_districts_geom; cadastre_vs_market_pct в scope, аномалии
(>+50% / <-30%) подсвечены в UI.
- Sentry release tracking (#4 ): IMAGE_TAG → backend/.env.runtime →
sentry_sdk.init(release=...). Compose v2 env_file optional path.
Schemas: 63_schema_nspd_runs.sql (cad_buildings + nspd_scrape_runs/log
формализуют то, что уже жило в проде через 61_import_nspd_batch.py),
64_v_zk_rosreestr_velocity.sql (refresh с cad_buildings).
2026-04-30 21:51:19 +03:00
lekss361
17ad0e18f5
feat(geo): ЖК → district mapping через PostGIS-полигоны OSM (Limit_District_Geometry closed)
...
- 56_fetch_ekb_districts.py: Overpass query (admin_level=9 в bbox ЕКБ),
shapely-ассемблинг рваных OSM-веев в MultiPolygon, кэш в data/raw/.
- 56_schema_ekb_districts_geom.sql: CREATE TABLE с GIST.
- 57_kn_objects_district.sql: ALTER + backfill UPDATE через ST_Contains.
3032 ЖК Свердл проставили district_name (208 в Академическом, 158 в Чкаловском,
и т.д.), 454 за bbox ЕКБ остались NULL.
- domrf_kn.py: _backfill_district_names() после Phase A — каждый sweep
автоматически проставляет district_name свежезаписанным ЖК.
- analytics_queries.py: 4 места addr ILIKE → district_name = :dn
(_velocity_baseline, _elasticity_coef, _active_competitors_count, comparable).
- analytics_queries.py: graceful obj_class-degrade — если в районе все
obj_class=NULL (kn-API quirk), фильтр по target_class опускается на уровне
geo-запросов с warning. class_multiplier на ценах продолжает работать.
Smoke (Академический, Comfort, 50K м²): velocity_source=sale_graph (104 ЖК /
1872 точек), competitors=208 в районе, headline «3400 млн ₽ · 112 мес ·
ликвидность 21/100», 5 comparable ЖК района — все реалистичные.
2026-04-29 08:03:38 +03:00
lekss361
8dda3903e5
add log scrapper
2026-04-27 21:50:44 +03:00
lekss361
12b1eb8169
add logs
2026-04-27 20:51:44 +03:00
lekss361
b3c15bb8ea
fix ui lag
2026-04-27 20:26:55 +03:00
lekss361
522ecca5c4
ship #13-16: multi-target Dockerfile, per-object drill-in, CRM pipeline,
...
442-sweep instructions
#16 Dockerfile: runner (lean, 1.6 GB) + runner-with-chromium (2.9 GB).
Compose + deploy.yml pushes 2 GHCR images. Backend saves 1.3 GB.
#15 5 backend object endpoints + /analytics/objects/[id] page (gallery,
POI table, sale chart) + sparkline-driven PrinzipObjectsTable.
#14 prinzip_leads/deals + 2 MVs. Import script with PII-hashing &
--inspect-only mode. 3 funnel endpoints + Sankey/Monthly charts.
#13 README section with UI/CLI/SQL for 442-object sweep.
2026-04-27 19:32:37 +03:00
lekss361
6d3fa8cbd2
add domrf extras parser (sale_graph + sales_agg + infra + photos) +
...
fix Docker build for playwright
- Regenerate uv.lock with playwright + tenacity (was missing → uv sync
--frozen skipped them, hence playwright not in /app/.venv/bin/).
- Dockerfile: explicit Chromium runtime libs in apt (libnss3 + 14 more)
+ `playwright install chromium` BEFORE apt-lists cleanup.
- Schema 51_schema_kn_extras.sql: 5 new tables for time-series sales,
current aggregates, POI infrastructure, photo metadata, failure log.
- Scraper: 4 new fetch helpers + upserts; photo binary download via
Playwright APIRequest; failure-logging with full_url to kn_scrape_failures.
- CLI: --no-extras / --download-photos / --no-flats / --probe URL.
- Admin UI: extras checkboxes + failures table with copy-URL button.
- PRINZIP smoke: 28 objs, 5409 POI, 5150 photos metadata, sales_agg
matches probe (Парк Победы 145/291 = 49%).
2026-04-27 18:35:46 +03:00
lekss361
79070bfe99
add interactive parser of наш.дом.рф ЖК+flats with stealth Playwright
...
- Discovered real endpoints via chrome-devtools: /сервисы/api/kn/object
(offset/limit/place/objStatus) + /portal-kn/api/sales/portal/table.
Server-side filter ignored — local filter by developer.companyGroup.
- Pure Playwright in-context fetch (httpx blocked by ServicePipe TLS-fp).
- Saved fingerprint state in data/playwright_state.json for server reuse.
- Celery beat (configurable cron + jitter) + admin trigger endpoint
+ /admin/scrape UI page.
- Schema migration: UNIQUE(id, snapshot_date) for versioned snapshots,
kn_scrape_runs journal.
- Smoke-tested on PRINZIP: 28 ЖК / 826 квартир as expected.
2026-04-27 17:58:40 +03:00
lekss361
16481868a6
add anal 2
2026-04-27 13:05:36 +03:00
lekss361
c13cbaef2e
add data
2026-04-26 22:30:52 +03:00