[tradein][scrapers] N1 Realty integration — scraper class есть, endpoint не подключён #575

Closed
opened 2026-05-25 06:02:35 +00:00 by lekss361 · 5 comments
Owner

Проблема

backend/app/services/scrapers/n1.py существует, но нет admin endpoint и нет schedule entry. N1 — региональный портал EKB, потенциально хороший источник listings.

Что сделать

  1. Добавить POST /api/v1/admin/scrape/n1 endpoint в api/v1/admin.py.
  2. Реализовать run_n1_city_sweep() (анкерные точки EKB).
  3. Добавить scrape_schedules WHERE source='n1_city_sweep'.
  4. Интегрировать в estimator sources_used.

Acceptance

  • 24h после merge: listings WHERE source='n1' ≥ 100 строк за день.
  • N1 присутствует в estimator.sources_used для EKB запросов.
## Проблема `backend/app/services/scrapers/n1.py` существует, но нет admin endpoint и нет schedule entry. N1 — региональный портал EKB, потенциально хороший источник listings. ## Что сделать 1. Добавить `POST /api/v1/admin/scrape/n1` endpoint в `api/v1/admin.py`. 2. Реализовать `run_n1_city_sweep()` (анкерные точки EKB). 3. Добавить `scrape_schedules WHERE source='n1_city_sweep'`. 4. Интегрировать в estimator `sources_used`. ## Acceptance - 24h после merge: `listings WHERE source='n1'` ≥ 100 строк за день. - N1 присутствует в `estimator.sources_used` для EKB запросов.
lekss361 added the
scrapers
tradein
labels 2026-05-25 06:02:35 +00:00
lekss361 added the
scope/backend
status/ready
labels 2026-05-30 15:03:09 +00:00
Author
Owner

Активировано: +scope/backend +status/ready. Спека полная (endpoint + run_n1_city_sweep + scrape_schedules + estimator wiring + Acceptance). auto-backend подхватит.

Активировано: `+scope/backend +status/ready`. Спека полная (endpoint + run_n1_city_sweep + scrape_schedules + estimator wiring + Acceptance). auto-backend подхватит.
bot-backend self-assigned this 2026-05-30 15:30:05 +00:00
bot-backend added
status/wip
and removed
status/ready
labels 2026-05-30 15:30:07 +00:00
bot-backend added
status/review
and removed
status/wip
labels 2026-05-30 15:41:09 +00:00
Collaborator

Working on this in PR #745. Wired N1 city-sweep by mirroring yandex: run_n1_city_sweep (pipeline) + trigger_n1_city_sweep_run+dispatch (scheduler) + scrape_schedules seed 084 (enabled=true) + POST /admin/scrape/n1 on-demand. sources_used is derived from {lot.source} so n1 auto-appears — no estimator change (item 4 free). 5 sweep tests + 32 regression green, ruff clean. NB: diff includes incidental ruff-format reflows of pre-existing lines in the touched files (hook-enforced, mechanical).

Working on this in PR #745. Wired N1 city-sweep by mirroring yandex: `run_n1_city_sweep` (pipeline) + `trigger_n1_city_sweep_run`+dispatch (scheduler) + `scrape_schedules` seed 084 (enabled=true) + `POST /admin/scrape/n1` on-demand. `sources_used` is derived from `{lot.source}` so n1 auto-appears — no estimator change (item 4 free). 5 sweep tests + 32 regression green, ruff clean. NB: diff includes incidental ruff-format reflows of pre-existing lines in the touched files (hook-enforced, mechanical).
bot-reviewer added
status/qa
and removed
status/review
labels 2026-05-30 15:43:45 +00:00
Collaborator

QA: code merged & unit-verified, но acceptance — 24h-gated data-check, отложено.

Code-уровень (PR #745, merged): run_n1_city_sweep + scheduler dispatch + scrape_schedules seed 084 (enabled) + POST /admin/scrape/n1 + sources_used авто-derive из {lot.source} (item 4 free). 5 sweep + 32 regression тестов зелёные, ruff clean. Wiring корректен.

Runtime acceptance — НЕ оценимо сейчас (by design «24h после merge»):

  1. listings WHERE source='n1' ≥ 100 за день — нужен прогон schedule-084 sweep; на merge+5min n1-строк 0. У QA-окна нет postgres-tradein доступа прочитать счёт.
  2. n1 в estimator.sources_used — авто-появится ТОЛЬКО когда n1-listings лягут рядом с запросом (т.е. после п.1).

Риск-флаг: n1 egress может делить тот же firewall, что Avito/Cian прод-воркер (#623 ротация egress IP / #726 avito firewall, оба status/blocked). Если schedule-084 sweep упрётся в блок — данные не лягут и acceptance не выполнится без infra-unblock.

→ оставляю status/qa. Re-QA через ~24h (после прогона sweep): SELECT count(*) FROM listings WHERE source='n1' AND scraped_at > now()-interval '24h' ≥ 100, и n1 в sources_used для ЕКБ-запроса. Если к тому моменту 0 строк — классифицировать как egress-firewall блокер (needs-human, как #726).

⏳ **QA: code merged & unit-verified, но acceptance — 24h-gated data-check, отложено.** **✅ Code-уровень (PR #745, merged):** `run_n1_city_sweep` + scheduler dispatch + `scrape_schedules` seed 084 (enabled) + `POST /admin/scrape/n1` + `sources_used` авто-derive из `{lot.source}` (item 4 free). 5 sweep + 32 regression тестов зелёные, ruff clean. Wiring корректен. **⏳ Runtime acceptance — НЕ оценимо сейчас (by design «24h после merge»):** 1. `listings WHERE source='n1' ≥ 100 за день` — нужен прогон schedule-084 sweep; на merge+5min n1-строк **0**. У QA-окна нет `postgres-tradein` доступа прочитать счёт. 2. `n1 в estimator.sources_used` — авто-появится ТОЛЬКО когда n1-listings лягут рядом с запросом (т.е. после п.1). **Риск-флаг:** n1 egress может делить тот же firewall, что Avito/Cian прод-воркер (#623 ротация egress IP / #726 avito firewall, оба `status/blocked`). Если schedule-084 sweep упрётся в блок — данные не лягут и acceptance не выполнится без infra-unblock. → оставляю `status/qa`. **Re-QA через ~24h** (после прогона sweep): `SELECT count(*) FROM listings WHERE source='n1' AND scraped_at > now()-interval '24h'` ≥ 100, и n1 в `sources_used` для ЕКБ-запроса. Если к тому моменту 0 строк — классифицировать как egress-firewall блокер (needs-human, как #726).
lekss361 added this to the Praktika demo — Mon 2026-06-01 milestone 2026-05-30 17:21:13 +00:00
lekss361 modified the milestone from Praktika demo — Mon 2026-06-01 to Night batch — 2026-05-31 2026-05-30 19:39:08 +00:00
Author
Owner

🔍 Verify (2026-05-31): интеграция N1 завершена — все 4 DoD-пункта в коде:

  1. POST /admin/scrape/n1 — admin.py:691 ✓
  2. run_n1_city_sweep — scrape_pipeline ✓
  3. schedule source='n1_city_sweep' — id=109 (seed 084) ✓
  4. estimator sources_used — авто (estimator.py:2191 {lot.source}), n1-аналоги попадают сами ✓

Live: 264 n1 listings (доказывают endpoint+sweep). НО schedule 109 enabled=false, последний скрейп 2026-05-23 → continuous «≥100/день» не идёт (тот же ops-gap, что #814).

Интеграционная часть done. Для close: qa-smoke manual endpoint + (для непрерывного потока) enable schedule 109 на проде. Оставляю в status/qa.

🔍 Verify (2026-05-31): интеграция N1 **завершена** — все 4 DoD-пункта в коде: 1. `POST /admin/scrape/n1` — admin.py:691 ✓ 2. `run_n1_city_sweep` — scrape_pipeline ✓ 3. schedule `source='n1_city_sweep'` — id=109 (seed 084) ✓ 4. estimator `sources_used` — авто (estimator.py:2191 `{lot.source}`), n1-аналоги попадают сами ✓ Live: **264** n1 listings (доказывают endpoint+sweep). НО schedule 109 `enabled=false`, последний скрейп 2026-05-23 → continuous «≥100/день» не идёт (тот же ops-gap, что #814). Интеграционная часть done. Для close: qa-smoke manual endpoint + (для непрерывного потока) enable schedule 109 на проде. Оставляю в status/qa.
Author
Owner

Закрываю как superseded: N1 Realty депрекейтнут — источник переехал в Cian, schedule id=109 (n1) disabled, EPIC #795 closed (см. #815 «n1 DEPRECATED — переехал в Cian»). Прод: listings WHERE source='n1' = 339 строк, 0 активных прогонов. Интеграция больше не нужна → close.

Закрываю как **superseded**: N1 Realty депрекейтнут — источник переехал в Cian, schedule id=109 (`n1`) disabled, EPIC #795 closed (см. #815 «~~n1~~ DEPRECATED — переехал в Cian»). Прод: `listings WHERE source='n1'` = 339 строк, 0 активных прогонов. Интеграция больше не нужна → close.
lekss361 removed the
status/qa
label 2026-06-06 18:53:33 +00:00
Sign in to join this conversation.
No project
No assignees
3 participants
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#575
No description provided.