feat(tradein/domclick): local-runner + ingest tooling (mergeable split from #2005) #2033

Merged
lekss361 merged 1 commit from feat/tradein-domclick-local-tooling into main 2026-06-28 07:29:41 +00:00
Owner

Что

Выделяет мерджабельную часть DomClick-тулинга из запаркованного PR #2005 ([BLOCKED #2000]) на main. Прод Layer-B скрейпер (через прокси) режет QRATOR-403 и остаётся заблокирован — но local-runner + ingest от прокси не зависят (домашний IP / operator-run) и работают.

Файлы (6, без прод Layer-B)

  • scripts/domclick_local_runner.py — ручной offline-сборщик с домашнего IP. SERP-enumerate (фронт; прямой BFF-JSON режет QRATOR), card __SSR_STATE__ + offer-card v3 (price_prediction AVM + sold_similar). --enum-cache (enumerate 1 раз → файл с sentinel → след. запуск пропускает enumerate), wait_for_selector, resume по id. Self-contained (без app.*).
  • scripts/ingest_domclick_jsonl.py — JSONL → trade-in БД: save_listings (upsert + house-match в SAVEPOINT, fault-tolerant) + save_detail_enrichment (detail-колонки COALESCE + offer_price_history). Идемпотентно, --limit/--dry-run.
  • app/services/scrapers/domclick_detail.py + domclick_exceptions.py — card-SSR parse + save_detail_enrichment (нужны ингесту). Импортятся только ингестом (operator-run); прод-runtime их не дёргает → dormant в образе.
  • tests/scrapers/test_domclick_detail.py + обновлённый scripts/README.md (операторская инструкция под текущий раннер).

Чего НЕ включает (остаётся на #2005, BLOCKED)

tasks/domclick_detail_backfill.py (прод Celery-task), scheduler.py расписание, data/sql/139_* — это и есть заблокированный #2000 прод Layer-B.

Безопасность

  • БД-схема не меняется — detail-колонки уже в проде, миграции нет.
  • Редеплой не трогает скрейп — раннер крутится локально (home-IP), не в контейнере.
  • Resume-safe--enum-cache + JSONL-resume: рестарт продолжает строго с позиции, без пересбора и перекачки готовых.

Live-validated

Раннер качает ЕКБ-вторичку прямо сейчас (600+ карт, 0 блоков); ингест залил их в прод-БД (house_matched, идемпотентно); domklik уже в estimator-аналогах + sources_used (проверено через /estimate).

## Что Выделяет **мерджабельную** часть DomClick-тулинга из запаркованного PR #2005 (`[BLOCKED #2000]`) на main. Прод Layer-B скрейпер (через прокси) режет QRATOR-403 и остаётся заблокирован — но **local-runner + ingest от прокси не зависят** (домашний IP / operator-run) и работают. ## Файлы (6, без прод Layer-B) - **`scripts/domclick_local_runner.py`** — ручной offline-сборщик с домашнего IP. SERP-enumerate (фронт; прямой BFF-JSON режет QRATOR), card `__SSR_STATE__` + offer-card v3 (`price_prediction` AVM + `sold_similar`). **`--enum-cache`** (enumerate 1 раз → файл с sentinel → след. запуск пропускает enumerate), `wait_for_selector`, resume по id. Self-contained (без `app.*`). - **`scripts/ingest_domclick_jsonl.py`** — JSONL → trade-in БД: `save_listings` (upsert + house-match в SAVEPOINT, fault-tolerant) + `save_detail_enrichment` (detail-колонки COALESCE + `offer_price_history`). Идемпотентно, `--limit`/`--dry-run`. - **`app/services/scrapers/domclick_detail.py`** + **`domclick_exceptions.py`** — card-SSR parse + `save_detail_enrichment` (нужны ингесту). Импортятся **только** ингестом (operator-run); прод-runtime их не дёргает → dormant в образе. - **`tests/scrapers/test_domclick_detail.py`** + обновлённый **`scripts/README.md`** (операторская инструкция под текущий раннер). ## Чего НЕ включает (остаётся на #2005, BLOCKED) `tasks/domclick_detail_backfill.py` (прод Celery-task), `scheduler.py` расписание, `data/sql/139_*` — это и есть заблокированный #2000 прод Layer-B. ## Безопасность - **БД-схема не меняется** — detail-колонки уже в проде, миграции нет. - **Редеплой не трогает скрейп** — раннер крутится локально (home-IP), не в контейнере. - **Resume-safe** — `--enum-cache` + JSONL-resume: рестарт продолжает строго с позиции, без пересбора и перекачки готовых. ## Live-validated Раннер качает ЕКБ-вторичку прямо сейчас (600+ карт, 0 блоков); ингест залил их в прод-БД (house_matched, идемпотентно); domklik уже в estimator-аналогах + `sources_used` (проверено через `/estimate`).
lekss361 added 1 commit 2026-06-28 07:28:33 +00:00
feat(tradein/domclick): local-runner + ingest tooling → main (split from parked Layer-B)
All checks were successful
CI / changes (pull_request) Successful in 7s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
43b392b809
Выделяет МЕРДЖАБЕЛЬНУЮ часть DomClick-тулинга из запаркованного PR #2005
(BLOCKED #2000 — прод Layer-B скрейпер через прокси режет QRATOR-403):

- scripts/domclick_local_runner.py — ручной offline-сборщик с домашнего IP:
  SERP-enumerate (фронт, BFF-JSON режет QRATOR) + card __SSR_STATE__ +
  offer-card v3 (AVM price_prediction + sold_similar). --enum-cache (enumerate
  1 раз → файл с sentinel → следующий запуск грузит кэш и пропускает enumerate),
  wait_for_selector (SERP-карточки догидрируются), resume по id. Self-contained.
- scripts/ingest_domclick_jsonl.py — JSONL → trade-in БД (save_listings +
  house-match в SAVEPOINT + save_detail_enrichment, идемпотентно, --limit/--dry-run).
- app/services/scrapers/domclick_detail.py + domclick_exceptions.py — card-SSR
  parse + save_detail_enrichment (нужны ингесту). Импортятся ТОЛЬКО ингестом
  (operator-run); прод-runtime их не дёргает (dormant в образе).
- tests/scrapers/test_domclick_detail.py + обновлённый scripts/README.md.

НЕ включает прод Layer-B (tasks/domclick_detail_backfill.py, scheduler-расписание,
data/sql/139_*) — остаётся запаркован на PR #2005 до чистого прокси (#2000).
БД-схема не меняется (detail-колонки уже в проде, миграции нет).

Live-validated: раннер качает ЕКБ-вторичку прямо сейчас (600+ карт, 0 блоков),
ингест залил их в прод-БД (house_matched, идемпотентно).
lekss361 merged commit 2184453d8e into main 2026-06-28 07:29:41 +00:00
lekss361 deleted branch feat/tradein-domclick-local-tooling 2026-06-28 07:29:41 +00:00
Sign in to join this conversation.
No reviewers
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#2033
No description provided.