B2-1: Sales Tracker v1 — шахматки 3-5 застройщиков ЕКБ #60

Closed
opened 2026-05-11 20:33:03 +00:00 by lekss361 · 1 comment
lekss361 commented 2026-05-11 20:33:03 +00:00 (Migrated from github.com)

Эшелон: 💎 Data moat & market intel

Зачем (killer для Раунда А)

Через 6+ мес накопления — уникальная база velocity ЕКБ, которой нет у TestFit/rTIM. Smart Unit-Mix в Generative требует этих данных. Velocity Score в Site Finder тоже. Из SalesTracking_Strategy_Apr25 — обещанный data moat в питче.

Что сделать

DB schema

CREATE TABLE sales_tracker_apartments (
  id BIGSERIAL PRIMARY KEY,
  jk_id TEXT NOT NULL,
  developer_slug TEXT NOT NULL,
  room_count SMALLINT,
  area_sqm NUMERIC,
  floor SMALLINT,
  section TEXT,
  price_rub NUMERIC,
  status TEXT,  -- available/reserved/sold
  first_seen_at TIMESTAMPTZ,
  last_seen_at TIMESTAMPTZ,
  UNIQUE(developer_slug, jk_id, section, floor, room_count, area_sqm)
);

CREATE TABLE sales_tracker_snapshots (
  apartment_id BIGINT REFERENCES sales_tracker_apartments(id),
  snapshot_date DATE,
  status TEXT,
  price_rub NUMERIC,
  PRIMARY KEY (apartment_id, snapshot_date)
);

Per-developer adapters

  • backend/app/services/scrapers/sales_tracker/brusnika.py
  • backend/app/services/scrapers/sales_tracker/atomstroy.py
  • backend/app/services/scrapers/sales_tracker/ten_devel.py

Старт с 3 застройщиков с качественными веб-шахматками: Брусника, Атомстройкомплекс, ТЭН-Девелопмент.

Tech

  • SPA-сайты → Playwright stealth (есть stealth.py)
  • SSR → httpx + BeautifulSoup
  • Celery task tasks.sales_tracker.scrape_all — cron 1×в сутки 04:00 МСК (named queue scrape_kn)
  • UPSERT по UNIQUE constraint
  • INSERT snapshot row даже если no change (для time series)

Monitoring

  • Sentry alert если scraper вернул 0 apartments (HTML структура сломалась)
  • Admin endpoint POST /admin/scrape/sales-tracker для manual trigger
  • kn_scrape_runs analog для sales_tracker — отдельные runs

Acceptance

  • 3 застройщика scraping daily
  • SELECT COUNT(*) FROM sales_tracker_apartments >1000 через неделю
  • Sentry alerts работают на test (sabotage HTML)
  • Через 2 недели — visible velocity trend per JK

Owner

backend-engineer

Effort

~5 дней (Sprint 3, может параллельно с PKK parser)

Risks

  • Playwright stealth — застройщики могут иметь антибот. Mitigation: начать с самых простых сайтов (Брусника headless OK по отчётам)
  • Юридика: шахматки = публичные данные. Прецедентов нет. Из vault [SalesTracking_Strategy_Apr25]: «партнёрство возамен аналитики» с топ-3
  • Низкое качество мелких застройщиков — только топ
**Эшелон:** 💎 Data moat & market intel ## Зачем (killer для Раунда А) Через 6+ мес накопления — **уникальная база velocity ЕКБ**, которой нет у TestFit/rTIM. Smart Unit-Mix в Generative требует этих данных. Velocity Score в Site Finder тоже. Из [SalesTracking_Strategy_Apr25](https://obsidian.gendsgn.ru/) — обещанный data moat в питче. ## Что сделать ### DB schema ```sql CREATE TABLE sales_tracker_apartments ( id BIGSERIAL PRIMARY KEY, jk_id TEXT NOT NULL, developer_slug TEXT NOT NULL, room_count SMALLINT, area_sqm NUMERIC, floor SMALLINT, section TEXT, price_rub NUMERIC, status TEXT, -- available/reserved/sold first_seen_at TIMESTAMPTZ, last_seen_at TIMESTAMPTZ, UNIQUE(developer_slug, jk_id, section, floor, room_count, area_sqm) ); CREATE TABLE sales_tracker_snapshots ( apartment_id BIGINT REFERENCES sales_tracker_apartments(id), snapshot_date DATE, status TEXT, price_rub NUMERIC, PRIMARY KEY (apartment_id, snapshot_date) ); ``` ### Per-developer adapters - `backend/app/services/scrapers/sales_tracker/brusnika.py` - `backend/app/services/scrapers/sales_tracker/atomstroy.py` - `backend/app/services/scrapers/sales_tracker/ten_devel.py` **Старт с 3 застройщиков** с качественными веб-шахматками: Брусника, Атомстройкомплекс, ТЭН-Девелопмент. ### Tech - SPA-сайты → Playwright stealth (есть `stealth.py`) - SSR → httpx + BeautifulSoup - Celery task `tasks.sales_tracker.scrape_all` — cron 1×в сутки 04:00 МСК (named queue `scrape_kn`) - UPSERT по UNIQUE constraint - INSERT snapshot row даже если no change (для time series) ### Monitoring - Sentry alert если scraper вернул 0 apartments (HTML структура сломалась) - Admin endpoint `POST /admin/scrape/sales-tracker` для manual trigger - `kn_scrape_runs` analog для sales_tracker — отдельные runs ## Acceptance - [ ] 3 застройщика scraping daily - [ ] `SELECT COUNT(*) FROM sales_tracker_apartments` >1000 через неделю - [ ] Sentry alerts работают на test (sabotage HTML) - [ ] Через 2 недели — visible velocity trend per JK ## Owner `backend-engineer` ## Effort ~5 дней (Sprint 3, может параллельно с PKK parser) ## Risks - Playwright stealth — застройщики могут иметь антибот. **Mitigation:** начать с самых простых сайтов (Брусника headless OK по отчётам) - Юридика: шахматки = публичные данные. Прецедентов нет. Из vault [SalesTracking_Strategy_Apr25]: «партнёрство возамен аналитики» с топ-3 - Низкое качество мелких застройщиков — только топ ## Links - [SalesTracking_Strategy_Apr25](https://obsidian.gendsgn.ru/) — стратегия - Closes часть #7 (Stage 2a — sales_tracker)
lekss361 added the
priority/p1
scope/backend
labels 2026-06-17 20:18:01 +00:00
Collaborator

Закрыто — capability «шахматки застройщиков» построена и живёт, но через ПРЕВОСХОДЯЩИЙ источник, чем предлагал issue (per-developer Playwright-скраперы): Objective (Объектив) B2B API. data/sql/68_schema_objective.sql определяет objective_lots (per-lot шахматка: developer/district/rooms/area/floor/section/status свободна-резерв-бронь-продан/is_sold/prices/snapshot_date) + objective_lots_history (append-only снимки) — ровно схема sales_tracker_apartments/snapshots из #60, но без хрупких скраперов 3-5 застройщиков. Данные активно собираются (objective_scrape_runs). Если нужен именно per-developer Playwright-fallback сверх Objective — отдельным тикетом.

✅ Закрыто — capability «шахматки застройщиков» построена и живёт, но через ПРЕВОСХОДЯЩИЙ источник, чем предлагал issue (per-developer Playwright-скраперы): **Objective (Объектив) B2B API**. `data/sql/68_schema_objective.sql` определяет `objective_lots` (per-lot шахматка: developer/district/rooms/area/floor/section/status свободна-резерв-бронь-продан/is_sold/prices/snapshot_date) + `objective_lots_history` (append-only снимки) — ровно схема `sales_tracker_apartments/snapshots` из #60, но без хрупких скраперов 3-5 застройщиков. Данные активно собираются (objective_scrape_runs). Если нужен именно per-developer Playwright-fallback сверх Objective — отдельным тикетом.
Sign in to join this conversation.
No project
No assignees
2 participants
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#60
No description provided.