From 84dde77450d10f3bb62eac5f66ebce57b4d08dfc Mon Sep 17 00:00:00 2001 From: bot-backend Date: Wed, 16 Sep 2026 21:58:20 +0300 Subject: [PATCH] =?UTF-8?q?feat(scraper):=20=D1=80=D0=B5=D0=B3=D1=83=D0=BB?= =?UTF-8?q?=D1=8F=D1=80=D0=BD=D1=8B=D0=B9=20=D1=81=D0=B1=D0=BE=D1=80=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D0=9C=D0=BE=D1=81=D0=BA=D0=B2=D0=B5=20=D0=B8=20?= =?UTF-8?q?=D0=BE=D0=B1=D0=BB=D0=B0=D1=81=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Корпус 77/50 жил разовой загрузкой: всё собрано 10-12.09. При LISTINGS_FRESH_DAYS=14 свежих объявлений не осталось бы с 26-27.09, после чего оценка по этим регионам деградировала бы до релаксированного тира, а коэффициент asking->sold перестал бы переписываться. Кода не требовалось: якоря, гео-профили и региональная параметризация слиты в #3533, не было только строк расписания. Шесть строк: avito/cian/yandex × Москва/область. Слаги moskva и moskovskaya_oblast уже в CITY_ANCHORS (25 и 44 якоря), wildcard-хендлеры резолвят их на те же джобы, что ЕКБ. radius_m задан явно — 8000 по Москве и 10000 по области, ровно те, на которых мерили покрытие сетки. Дефолт джобы 1500 м обрушил бы покрытие, ради которого якоря подбирались. newbuilding_only=false у cian: дефолт джобы true, а корпус нужен вторичный. Строки включены сразу, в отличие от seed'ов 289/302 — иначе корпус истекает раньше, чем кто-то вернётся к вопросу. DomClick (≈23% корпуса обоих регионов) не заведён: у него нет wildcard-хендлера, а единственная строка source='domclick_city_sweep' занята Екатеринбургом. Нужна правка кода, отдельной задачей. --- ..._scrape_schedules_seed_msk_city_sweeps.sql | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 tradein-mvp/backend/data/sql/305_scrape_schedules_seed_msk_city_sweeps.sql 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; -- 2.45.3