feat(tradein/scraper): per-city sweep capability для 5 городов области (schedules disabled) #2487

Merged
lekss361 merged 1 commit from fix/tradein-oblast-b1-city-anchors into main 2026-07-12 17:10:23 +00:00
Owner

Что

B1 расширения Mera на область: capability гонять city-sweep скраперы (avito/cian/yandex) по городам Свердловской обл. — Нижний Тагил / Каменск-Уральский / Первоуральск / Верхняя Пышма / Серов. Schedules засеяны DISABLED — rollout вручную по одному городу (⚠️ proxy-пул = 1 живой прокси, масштабировать нельзя разом). domclick (B2) — отдельно, не тронут.

Изменения

  • pipeline.py: CITY_ANCHORS (5 городов, центр-анкоры) + get_city_anchors(slug) (None → EKB_ANCHORS fallback). run_*_city_sweep(anchors=) уже принимает.
  • scheduler.py: _job_{avito,cian,yandex}_city_sweep читают params.city → резолвят анкоры. Wildcard-хендлеры avito/cian/yandex_city_sweep_* (т.к. scrape_schedules.source UNIQUE → каждому городу свой source avito_city_sweep_nizhniy_tagil; механизм как existing deactivate_stale_*).
  • geo.py: OBLAST66_BBOX + is_within_oblast66_bbox (совпадает с geocoder). avito/detail.py: ingest coord-guard is_within_ekb_bbox_wideis_within_oblast66_bbox (иначе координаты не-ЕКБ сбрасывались в None).
  • price_brackets.py: 5 city-seed (reuse EKB brackets, временно — реальной стат-ки нет).
  • migration 179: 15 rows (5 городов × 3 источника), все enabled=false, staggered окна (15 непересекающихся часовых слотов), idempotent ON CONFLICT (source) DO NOTHING.
  • +6 тестов (city-anchor resolution с/без/unknown city, wildcard).

Проверка

  • code-review: APPROVE, без блокеров (wildcard resolution, bbox-guard, миграция idempotent+disabled — verified).
  • Полный tradein backend suite: 2396 passed (+ pre-existing test_search_cache_hit, как в CI). ruff clean.
  • Подтверждено: ни один schedule не enabled, прокси не тронут, scrape не триггерился.

Rollout (после merge, вручную мной)

  1. Перед enable города: настроить radius_m под площадь (1 anchor × 1500м может не покрыть Н.Тагил/Каменск).
  2. Включать ПО ОДНОМУ городу (UPDATE scrape_schedules SET enabled=true, next_run_at=now() WHERE source='avito_city_sweep_<slug>'), мониторить proxy-health + bans.
## Что B1 расширения Mera на область: capability гонять city-sweep скраперы (avito/cian/yandex) по городам Свердловской обл. — **Нижний Тагил / Каменск-Уральский / Первоуральск / Верхняя Пышма / Серов**. Schedules засеяны **DISABLED** — rollout вручную по одному городу (⚠️ proxy-пул = 1 живой прокси, масштабировать нельзя разом). domclick (B2) — отдельно, не тронут. ## Изменения - **pipeline.py**: `CITY_ANCHORS` (5 городов, центр-анкоры) + `get_city_anchors(slug)` (None → EKB_ANCHORS fallback). `run_*_city_sweep(anchors=)` уже принимает. - **scheduler.py**: `_job_{avito,cian,yandex}_city_sweep` читают `params.city` → резолвят анкоры. **Wildcard-хендлеры** `avito/cian/yandex_city_sweep_*` (т.к. `scrape_schedules.source` UNIQUE → каждому городу свой source `avito_city_sweep_nizhniy_tagil`; механизм как existing `deactivate_stale_*`). - **geo.py**: `OBLAST66_BBOX` + `is_within_oblast66_bbox` (совпадает с geocoder). **avito/detail.py**: ingest coord-guard `is_within_ekb_bbox_wide` → `is_within_oblast66_bbox` (иначе координаты не-ЕКБ сбрасывались в None). - **price_brackets.py**: 5 city-seed (reuse EKB brackets, временно — реальной стат-ки нет). - **migration 179**: 15 rows (5 городов × 3 источника), все `enabled=false`, staggered окна (15 непересекающихся часовых слотов), idempotent `ON CONFLICT (source) DO NOTHING`. - +6 тестов (city-anchor resolution с/без/unknown city, wildcard). ## Проверка - code-review: ✅ **APPROVE**, без блокеров (wildcard resolution, bbox-guard, миграция idempotent+disabled — verified). - Полный tradein backend suite: 2396 passed (+ pre-existing `test_search_cache_hit`, как в CI). ruff clean. - Подтверждено: ни один schedule не enabled, прокси не тронут, scrape не триггерился. ## Rollout (после merge, вручную мной) 1. Перед enable города: настроить `radius_m` под площадь (1 anchor × 1500м может не покрыть Н.Тагил/Каменск). 2. Включать ПО ОДНОМУ городу (`UPDATE scrape_schedules SET enabled=true, next_run_at=now() WHERE source='avito_city_sweep_<slug>'`), мониторить proxy-health + bans.
lekss361 added 1 commit 2026-07-12 17:07:17 +00:00
feat(tradein/scraper): per-city sweep capability для 5 городов области (schedules disabled)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 9s
CI Trade-In / frontend-checks (pull_request) Has been skipped
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
CI Trade-In / backend-tests (pull_request) Successful in 52s
cf91ac6b24
B1: avito/cian/yandex city-sweep по городам Свердловской обл. (Н.Тагил/Каменск/Первоуральск/В.Пышма/Серов). Schedules засеяны DISABLED — rollout вручную по одному городу (proxy = 1 живой прокси).

- pipeline.py: CITY_ANCHORS (5) + get_city_anchors(slug) (None→EKB fallback).
- scheduler.py: sweep-jobs читают params.city → анкоры; wildcard-хендлеры *_city_sweep_* (source UNIQUE → per-city source, как deactivate_stale_*).
- geo.py: OBLAST66_BBOX + is_within_oblast66_bbox; avito/detail.py ingest-guard EKB→oblast66.
- price_brackets.py: 5 city-seed (reuse EKB). migration 179: 15 rows enabled=false, staggered, idempotent.
- +6 тестов. domclick (B2) не тронут.
lekss361 merged commit 90a6e4bfe9 into main 2026-07-12 17:10:23 +00:00
lekss361 deleted branch fix/tradein-oblast-b1-city-anchors 2026-07-12 17:10:23 +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#2487
No description provided.