- 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.
47 lines
2.5 KiB
SQL
47 lines
2.5 KiB
SQL
-- Расширения схемы для регулярного парсинга наш.дом.рф /сервисы/api/kn/{flats,objects}.
|
||
-- См. план C:\Users\user\.claude\plans\crispy-waddling-swing.md.
|
||
|
||
-- ── Версионирование строк через UNIQUE (id, snapshot_date) ────────────────
|
||
-- Текущий PK на flats.id и objects.obj_id мешает сохранять несколько срезов
|
||
-- одного и того же ЖК/квартиры. Меняем на UNIQUE по (id, snapshot_date)
|
||
-- чтобы UPSERT идемпотентно записывал свежий snapshot.
|
||
|
||
ALTER TABLE domrf_kn_flats DROP CONSTRAINT IF EXISTS domrf_kn_flats_pkey;
|
||
ALTER TABLE domrf_kn_flats
|
||
ADD CONSTRAINT uq_kn_flats_id_snap UNIQUE (id, snapshot_date);
|
||
|
||
ALTER TABLE domrf_kn_objects DROP CONSTRAINT IF EXISTS domrf_kn_objects_pkey;
|
||
ALTER TABLE domrf_kn_objects
|
||
ADD CONSTRAINT uq_kn_objects_id_snap UNIQUE (obj_id, snapshot_date);
|
||
|
||
-- ── Backfill region_cd для Антоновых flats где obj_id матчится с Свердл ──
|
||
UPDATE domrf_kn_flats f
|
||
SET region_cd = 66
|
||
FROM domrf_kn_objects o
|
||
WHERE f.obj_id = o.obj_id
|
||
AND o.region_cd = 66
|
||
AND f.region_cd IS NULL;
|
||
|
||
-- ── Композитные индексы для выборок последнего среза ──────────────────────
|
||
CREATE INDEX IF NOT EXISTS idx_kn_flats_region_snap
|
||
ON domrf_kn_flats (region_cd, snapshot_date);
|
||
CREATE INDEX IF NOT EXISTS idx_kn_objects_region_snap
|
||
ON domrf_kn_objects (region_cd, snapshot_date);
|
||
|
||
-- ── Журнал прогонов скрейпера ─────────────────────────────────────────────
|
||
CREATE TABLE IF NOT EXISTS kn_scrape_runs (
|
||
run_id BIGSERIAL PRIMARY KEY,
|
||
started_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||
finished_at TIMESTAMPTZ,
|
||
region_codes INT[] NOT NULL,
|
||
developer_ids TEXT[],
|
||
objects_count INT,
|
||
flats_count INT,
|
||
requests_count INT,
|
||
status TEXT NOT NULL DEFAULT 'running', -- running | done | failed
|
||
error TEXT,
|
||
snapshot_date DATE NOT NULL DEFAULT CURRENT_DATE
|
||
);
|
||
CREATE INDEX IF NOT EXISTS idx_kn_runs_status ON kn_scrape_runs (status, started_at DESC);
|
||
|
||
COMMENT ON TABLE kn_scrape_runs IS 'Журнал запусков парсера наш.дом.рф kn-API. Один прогон = один (regions, developers) sweep.';
|