chore(scrapers): убрать устаревший n1-скраппер (n1.ru → cian), сохранить историч. данные #1556

Merged
bot-backend merged 1 commit from chore/remove-n1-scraper into main 2026-06-16 11:58:03 +00:00
Owner

Зачем

Источник n1.ru устарел — переехал в cian (владелец подтвердил). n1_city_sweep ещё активно скрапил мёртвый источник (последний прогон сегодня 04:13). Убираем n1 как активный скраппер, сохраняя исторические 389 listings и их отображение.

Убрано (активный скрап-путь, −627 строк)

  • app/services/scrapers/n1.py — удалён (N1Scraper, 271 стр).
  • scrape_pipeline.pyrun_n1_city_sweep + N1CitySweepCounters + хелперы.
  • scheduler.pytrigger_n1_city_sweep_run + dispatch elif + docstring.
  • admin.py/scrape/n1 + /scrape/n1/runs endpoints, "n1" из _ALL_SOURCES/Literal-входа, multi_room_n1, N1 dispatch.
  • scraper_settings.py"n1" delay.
  • tests/test_n1_city_sweep.py, tests/test_n1_floor_parse.py — удалены; test_scraper_settings.py — n1→domklik.
  • Миграция 114 114_disable_n1_sweep.sqlUPDATE scrape_schedules SET enabled=false WHERE source='n1_city_sweep' (idempotent guard, не DELETE — строка остаётся для истории run'ов).

Сохранено (историческое — НЕ трогали)

  • schemas/search.py Literal[...,"n1"] — API-фильтр/сериализация 389 историч. listings (read-path).
  • config.py allowed hosts n1.ru/ekaterinburg.n1.ru — SSRF-allowlist (test_admin_ssrf зелёный).
  • trade_in_pdf.py лейбл "N1" + цвет — PDF/отображение историч.
  • geocoder.py — source-agnostic, не трогали. n1 listings в БД НЕ деактивированы/удалены.

Проверки

  • uv run pytest (полный suite, оба CI-deselect): 1802 passed, 2 deselected (минус удалённые n1-тесты, без регрессий).
  • ruff check + format: clean.
  • code-reviewer: APPROVE — нет dangling-импортов (grep 0), admin консистентен, read-path enum сохранён, миграция non-destructive.

После мержа: n1 перестаёт скрапиться (schedule disabled), историч. данные/фильтры/PDF работают.

## Зачем Источник **n1.ru устарел — переехал в cian** (владелец подтвердил). n1_city_sweep ещё активно скрапил мёртвый источник (последний прогон сегодня 04:13). Убираем n1 как активный скраппер, **сохраняя исторические 389 listings** и их отображение. ## Убрано (активный скрап-путь, −627 строк) - `app/services/scrapers/n1.py` — удалён (N1Scraper, 271 стр). - `scrape_pipeline.py` — `run_n1_city_sweep` + `N1CitySweepCounters` + хелперы. - `scheduler.py` — `trigger_n1_city_sweep_run` + dispatch elif + docstring. - `admin.py` — `/scrape/n1` + `/scrape/n1/runs` endpoints, `"n1"` из `_ALL_SOURCES`/Literal-входа, `multi_room_n1`, N1 dispatch. - `scraper_settings.py` — `"n1"` delay. - `tests/test_n1_city_sweep.py`, `tests/test_n1_floor_parse.py` — удалены; `test_scraper_settings.py` — n1→domklik. - **Миграция 114** `114_disable_n1_sweep.sql` — `UPDATE scrape_schedules SET enabled=false WHERE source='n1_city_sweep'` (idempotent guard, **не DELETE** — строка остаётся для истории run'ов). ## Сохранено (историческое — НЕ трогали) - `schemas/search.py` `Literal[...,"n1"]` — API-фильтр/сериализация 389 историч. listings (read-path). - `config.py` allowed hosts `n1.ru`/`ekaterinburg.n1.ru` — SSRF-allowlist (`test_admin_ssrf` зелёный). - `trade_in_pdf.py` лейбл "N1" + цвет — PDF/отображение историч. - `geocoder.py` — source-agnostic, не трогали. n1 listings в БД НЕ деактивированы/удалены. ## Проверки - `uv run pytest` (полный suite, оба CI-deselect): **1802 passed, 2 deselected** (минус удалённые n1-тесты, без регрессий). - `ruff check` + `format`: clean. - code-reviewer: ✅ APPROVE — нет dangling-импортов (grep 0), admin консистентен, read-path enum сохранён, миграция non-destructive. После мержа: n1 перестаёт скрапиться (schedule disabled), историч. данные/фильтры/PDF работают.
lekss361 added 1 commit 2026-06-16 11:56:06 +00:00
chore(tradein): деактивировать N1.ru scraper — источник переехал в Cian
All checks were successful
CI / openapi-codegen-check (push) 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 / changes (push) Successful in 8s
CI / backend-tests (push) Has been skipped
CI / frontend-tests (push) Has been skipped
CI / changes (pull_request) Successful in 7s
c07b5d7c5d
N1.ru перестал быть самостоятельным источником (переехал в Cian, подтверждено
владельцем 2026-06). Активный скрап прекращён; 389 исторических listings в БД
сохраняются без изменений.

Убрано:
- app/services/scrapers/n1.py (удалён)
- run_n1_city_sweep + N1CitySweepCounters + N1_SWEEP_MAX_CONSECUTIVE_FAILURES
  из scrape_pipeline.py
- trigger_n1_city_sweep_run + dispatch elif в scheduler.py
- POST /scrape/n1 + GET /scrape/n1/runs endpoints из admin.py
- N1Scraper из scrape_around dispatch dict и ScrapeRequest.multi_room_n1
- "n1": 5.0 из scraper_settings._DEFAULT_DELAY_BY_SOURCE
- tests/test_n1_city_sweep.py, tests/test_n1_floor_parse.py (удалены)

Добавлено:
- data/sql/114_disable_n1_sweep.sql: UPDATE scrape_schedules SET enabled=false
  WHERE source='n1_city_sweep' (idempotent, строка сохраняется для audit-истории)

Сохранено (историческое):
- schemas/search.py Literal[..."n1"] — API-фильтр исторических listings
- config.py scrape_allowed_hosts n1.ru / ekaterinburg.n1.ru
- exporters/trade_in_pdf.py — цвет/лейбл N1 для отображения старых записей
- geocoder.py и admin.py docstring N1-комментарии где не активный код

1802 passed, 2 deselected (test_search_cache_hit, test_cian_valuation.cache_hit)
lekss361 added the
chore
scope/backend
scrapers
labels 2026-06-16 11:56:11 +00:00
bot-backend merged commit a200025571 into main 2026-06-16 11:58:03 +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#1556
No description provided.