-- 122_enable_domclick_city_sweep.sql -- Seed row для DomClick периодического citywide SERP-sweep. -- -- !!! DORMANT BY DESIGN !!! enabled = false. -- DomClickScraper.fetch_city бьёт DomClick SERP с prod-IP через camoufox headless -- BrowserFetcher (DataDome пропускает headless Playwright; curl_cffi → 401). -- Capability полностью wired (run_domclick_city_sweep + trigger_domclick_city_sweep_run -- + dispatch в scheduler.py), но schedule засеян ВЫКЛЮЧЕННЫМ — live-поведение -- намеренно НЕ verified до ручного prod-smoke. ВКЛЮЧАТЬ ВРУЧНУЮ оператором: -- UPDATE scrape_schedules SET enabled = true WHERE source = 'domclick_city_sweep'; -- Зеркалит cian_city_sweep (107) и yandex_city_sweep (078, тоже enabled=false, dormant). -- -- DomClick SERP — CITYWIDE (city_id), не geo-radius: anchor-loop отсутствует. -- fetch_city перебирает rooms × pages внутри scraper'а и дедуплицирует по source_id. -- SERP координаты не отдаёт (lat=lon=None) → house-match только по address-fingerprint. -- SERP-only: нет detail/houses-фаз (в отличие от cian sweep), поэтому default_params -- несут только city_id / rooms / pages_per_anchor / request_delay_sec. -- -- ЗАВИСИМОСТИ: 052_scrape_schedules.sql (таблица + UNIQUE(source)). -- Idempotent: ON CONFLICT (source) DO NOTHING — безопасно запускать повторно. -- -- domclick_city_sweep — окно 03:00-06:00 UTC (06:00-09:00 МСК), после avito/cian/yandex -- sweeps (02:00-05:00 UTC) чтобы не конкурировать за egress в одно окно. -- default_params (консервативно, под DataDome): -- city_id — числовой ID города DomClick (4 = Екатеринбург). -- rooms — список комнатностей (0=студия, 1, 2, 3, 4). -- pages_per_anchor — максимум страниц SERP на один room-проход (break on empty). -- request_delay_sec — пауза между страницами SERP (anti-DataDome). BEGIN; -- next_run_at = следующее наступление night-window (tomorrow + window_start_hour). -- При enabled=false get_due_schedules() всё равно не подхватит строку, но заполняем -- по образцу 107: когда оператор включит schedule, next_run_at уже валиден и -- запуск не выстрелит мгновенно (вне окна). AT TIME ZONE 'UTC' фиксирует wall-clock -- час в UTC независимо от session TimeZone GUC. INSERT INTO scrape_schedules ( source, enabled, window_start_hour, window_end_hour, next_run_at, default_params ) VALUES ( 'domclick_city_sweep', false, -- DORMANT — enable manually after prod-smoke 3, 6, ((CURRENT_DATE + INTERVAL '1 day') + make_interval(hours => 3)) AT TIME ZONE 'UTC', '{"city_id": 4, "rooms": [0, 1, 2, 3, 4], "pages_per_anchor": 5, "request_delay_sec": 6}'::jsonb ) ON CONFLICT (source) DO NOTHING; COMMIT;