diff --git a/tradein-mvp/backend/data/sql/305_scrape_schedules_seed_msk_city_sweeps.sql b/tradein-mvp/backend/data/sql/305_scrape_schedules_seed_msk_city_sweeps.sql new file mode 100644 index 00000000..437fb5d7 --- /dev/null +++ b/tradein-mvp/backend/data/sql/305_scrape_schedules_seed_msk_city_sweeps.sql @@ -0,0 +1,77 @@ +-- 305_scrape_schedules_seed_msk_city_sweeps.sql +-- Регулярный сбор объявлений по Москве (77) и Московской области (50). +-- +-- Apply after: 304_asking_to_sold_ratios_region.sql +-- +-- WHY: +-- Корпус 77/50 живёт разовой загрузкой: всё, что есть, собрано 10-12.09.2026. +-- При LISTINGS_FRESH_DAYS = 14 свежих объявлений не останется с 26-27.09, после +-- чего оценка по этим регионам деградирует до релаксированного тира, а +-- asking->sold ratio перестанет переписываться. Регулярного сбора для 77/50 в +-- расписании не было ни одной строки: код якорей, гео-профилей и региональной +-- параметризации слит (#3533), но не включён. +-- +-- Слаги "moskva" / "moskovskaya_oblast" уже заведены в CITY_ANCHORS +-- (pipeline.py): 25 якорей сетки 5x5 по Москве и 44 по области (22 городских + +-- 22 кластерных по массе объявлений). Wildcard-хендлеры "*_city_sweep_*" +-- резолвят эти source'ы на те же джобы, что и ЕКБ. +-- +-- radius_m задан ЯВНО и равен тому, на котором мерили покрытие сетки: 8000 м по +-- Москве, 10000 м по области (MOSCOW_ANCHOR_RADIUS_M / MOSCOW_OBLAST_ANCHOR_ +-- RADIUS_M). Дефолт джобы — 1500 м; оставить его значило бы обрушить покрытие, +-- ради которого якоря и подбирались (замер: 73.8% -> 95.2% массы лотов области). +-- +-- newbuilding_only=false у cian — дефолт джобы true, а корпус нужен вторичный. +-- Тот же ключ стоит во всех oblast-строках миграции 179. +-- +-- ВКЛЮЧЕНЫ СРАЗУ (enabled=true), в отличие от seed-строк 289/302, где включение +-- оставляли отдельным решением. Причина названа выше: без сбора корпус истекает +-- 26-27.09, а регионы отдаются тестировщикам. Решение принято явно 16.09.2026. +-- +-- DomClick (≈23% корпуса обоих регионов) здесь НЕ заводится: у него нет +-- wildcard-хендлера ("domclick_city_sweep_*" отсутствует в _default_kit_handlers), +-- а единственная возможная строка source='domclick_city_sweep' занята +-- Екатеринбургом. Нужна правка кода — отдельной задачей. +-- +-- Окна 16-23 UTC выбраны как наименее занятые (по одной строке на час против +-- 5-7 в ночных окнах); прогоны всё равно сериализуются планировщиком, а +-- трёхчасовое окно даёт запас на overrun предшественника. +-- +-- Оценка нагрузки на такт: Москва avito 25x3 страниц при 7 с ≈ 9 мин, cian при +-- 5 с ≈ 6 мин, yandex при 9 с ≈ 11 мин; область (44 якоря) ≈ 15 / 11 / 20 мин. +-- Суммарно ≈ 72 мин раз в 3 суток. +-- +-- ИДЕМПОТЕНТНОСТЬ: ON CONFLICT (source) DO NOTHING — повторный прогон no-op и не +-- сбрасывает enabled, если строку потом выключили вручную. + +BEGIN; + +SET LOCAL lock_timeout = '5s'; + +INSERT INTO scrape_schedules (source, enabled, window_start_hour, window_end_hour, default_params) +VALUES + ('avito_city_sweep_moskva', true, 16, 19, + '{"city": "moskva", "region_code": 77, "radius_m": 8000, "pages_per_anchor": 3, + "detail_top_n": 0, "enrich_houses": true, "interval_days": 3, + "request_delay_sec": 7}'::jsonb), + ('cian_city_sweep_moskva', true, 17, 20, + '{"city": "moskva", "region_code": 77, "radius_m": 8000, "pages_per_anchor": 3, + "detail_top_n": 10, "enrich_houses": true, "interval_days": 3, + "newbuilding_only": false, "request_delay_sec": 5}'::jsonb), + ('yandex_city_sweep_moskva', true, 18, 21, + '{"city": "moskva", "region_code": 77, "radius_m": 8000, "pages_per_anchor": 3, + "interval_days": 3, "request_delay_sec": 9}'::jsonb), + ('avito_city_sweep_moskovskaya_oblast', true, 19, 22, + '{"city": "moskovskaya_oblast", "region_code": 50, "radius_m": 10000, + "pages_per_anchor": 3, "detail_top_n": 0, "enrich_houses": true, + "interval_days": 3, "request_delay_sec": 7}'::jsonb), + ('cian_city_sweep_moskovskaya_oblast', true, 20, 23, + '{"city": "moskovskaya_oblast", "region_code": 50, "radius_m": 10000, + "pages_per_anchor": 3, "detail_top_n": 10, "enrich_houses": true, + "interval_days": 3, "newbuilding_only": false, "request_delay_sec": 5}'::jsonb), + ('yandex_city_sweep_moskovskaya_oblast', true, 21, 23, + '{"city": "moskovskaya_oblast", "region_code": 50, "radius_m": 10000, + "pages_per_anchor": 3, "interval_days": 3, "request_delay_sec": 9}'::jsonb) +ON CONFLICT (source) DO NOTHING; + +COMMIT;