gendesign/tradein-mvp/backend/data/sql/138_domclick_bff_rewrite_schedule.sql
bot-backend 52fc920507 fix(tradein/domclick): rewrite dead scraper to BFF JSON API + honest status (#1846, #1968)
Old HTML scraper dead: /search?city_id retired in DomClick redesign + VPS IP
QRATOR-banned (prod domclick_city_sweep reported done/0 every run). New path:

- GET bff-search-web.domclick.ru/api/offers/v1 + count/v1 via
  BrowserFetcher(source="domclick") -> generic provider -> shared mobile proxy
  -> bypasses QRATOR (prod-verified live: 20 items returned, no block).
- Sweeps 6 room buckets (st/1/2/3/4/5+); recursive binary price-split for
  oversized buckets (rooms=2 ~2215 > offset cap 2000); count/v1 sizes buckets.
- Maps SERP JSON -> ScrapedLot with lat/lon at ~100% (closes avito 54% NULL-lat
  gap); per-card EKB geo-guard.
- Honest status (#1968): QRATOR block OR fetch errors with 0 lots -> mark_failed,
  not mark_done. Parse failures are per-page resilient (break bucket, keep partial
  lots) so a transient bad page never aborts the whole sweep.
- Schedule shipped DORMANT (enabled=false, pages=100) via
  138_domclick_bff_rewrite_schedule.sql; operator enables after prod smoke.

42 scraper tests (price-split boundaries, parse-error resilience, honest status);
full backend suite green; ruff clean. Layer B (detail renovation/wallType/
priceHistory) deferred to #1846 follow-up.
2026-06-27 13:57:07 +03:00

33 lines
1.7 KiB
PL/PgSQL

-- 138_domclick_bff_rewrite_schedule.sql
--
-- Обновляет параметры расписания domclick_city_sweep после переписки скрейпера
-- на BFF JSON API (https://bff-search-web.domclick.ru/api/offers/v1).
--
-- DORMANT: enabled остаётся false до тех пор пока оператор не верифицирует
-- прод-smoke нового BFF-скрейпера вручную:
-- UPDATE scrape_schedules SET enabled = true WHERE source = 'domclick_city_sweep';
--
-- Ключевые изменения относительно 122_enable_domclick_city_sweep.sql:
-- - pages_per_anchor поднят до 100 (каждый бакет до 2000 листингов,
-- rooms=2 нуждается в price-split → реально ≈330 страниц)
-- - rooms убран из default_params — скрейпер всегда обходит все ROOM_BUCKETS
-- (st/1/2/3/4/5+) внутри независимо от этого параметра
-- - request_delay_sec оставлен 6 (как в 122; BFF JSON легче HTML-рендера)
--
-- Зависимости: 052_scrape_schedules.sql (таблица), 122_enable_domclick_city_sweep.sql
-- (строка должна существовать — INSERT ON CONFLICT DO NOTHING в 122).
-- Idempotent: UPDATE не упадёт если строка уже обновлена (runs повторно безопасно).
BEGIN;
UPDATE scrape_schedules
SET enabled = false,
default_params = jsonb_build_object(
'city_id', 4,
'pages_per_anchor', 100,
'request_delay_sec', 6
),
updated_at = now()
WHERE source = 'domclick_city_sweep';
COMMIT;