feat(scraper): harvest plan_image из уже работающего catalog-скрапера (22d) — блокер для #299/#300 #2440

Open
opened 2026-07-05 15:43:41 +00:00 by bot-backend · 0 comments
Collaborator

Контекст

domrf_kn_flat_plans пуста (0 строк) — ни #299 (Phase 1 Potrace), ни #300 (Phase 2 CubiCasa) не могут двигаться дальше без реальных планировок ДОМ.РФ. Подробности и находки — комментарий на #300.

Своя же документация в flat_plans.py указывает на несуществующий "22d SSR-скрапер" как на недостающее звено. На деле строить его с нуля не нужно — domrf_catalog.py (via scrape_kn_catalog_objects.py, уже в Celery beat, 983k квартир в очереди) уже фетчит ровно те SSR-страницы каталога (/сервисы/каталог-квартир/квартира/{hash}), где лежит план — просто его _TextCollector сознательно дропает <img> (void-tag, issue #1608), поэтому картинка никогда не извлекалась.

Scope

  1. Открыть fetch_catalog_html на реальном obj_id=65136 (или любом другом с известным catalog_url_hash), найти реальный <img>/CSS-паттерн блока «Планировка» (class hint / data-* / соседний текстовый label «Планировка»).
  2. Расширить _TextCollector (или добавить отдельный лёгкий regex-pass по сырому HTML, не трогая существующую text-логику) — извлечь plan_image_url из parse_catalog_flat().
  3. Реализовать реальный download_plan_image() (заменить download_plan_image_stub в flat_plans.py) — Celery task, httpx GET, запись local_path/width_px/height_px/size_bytes через уже готовый upsert_flat_plans().
  4. Вызвать download_plan_image() из существующего scrape_one_flat() / scrape_catalog_batch() (domrf_catalog.py) — не заводить новый beat-schedule, просто довесить к уже идущему прогону.
  5. Rate-limit / retry — переиспользовать существующий паттерн catalog-скрапера (уже settled для 983k квартир).

Acceptance criteria

  • domrf_kn_flat_plans растёт по мере прохода уже идущего catalog-скрапера (не отдельный backfill-джоб)
  • ≥100 реальных планировок скачаны и лежат в local_path в течение суток после деплоя (наблюдаемо через freshness/count-запрос)
  • Не сломан существующий price/status/finishing-парсинг (parse_catalog_flat regression — прогнать test_domrf_catalog_parse.py)

Out of scope

  • Potrace-векторизация (#299 production-wiring) — отдельный PR после того как наберётся выборка
  • CubiCasa (#300) — заблокировано до факта нехватки Potrace

Estimated effort

~1 день (S). Единственный домен — backend/scrapers, без миграций (таблица уже есть).

Refs #300, #299

## Контекст `domrf_kn_flat_plans` пуста (0 строк) — ни #299 (Phase 1 Potrace), ни #300 (Phase 2 CubiCasa) не могут двигаться дальше без реальных планировок ДОМ.РФ. Подробности и находки — [комментарий на #300](https://git.gendsgn.ru/lekss361/gendesign/issues/300#issuecomment-21505). Своя же документация в `flat_plans.py` указывает на несуществующий "22d SSR-скрапер" как на недостающее звено. На деле строить его с нуля не нужно — `domrf_catalog.py` (via `scrape_kn_catalog_objects.py`, уже в Celery beat, 983k квартир в очереди) уже фетчит ровно те SSR-страницы каталога (`/сервисы/каталог-квартир/квартира/{hash}`), где лежит план — просто его `_TextCollector` сознательно дропает `<img>` (void-tag, issue #1608), поэтому картинка никогда не извлекалась. ## Scope 1. Открыть `fetch_catalog_html` на реальном `obj_id=65136` (или любом другом с известным `catalog_url_hash`), найти реальный `<img>`/CSS-паттерн блока «Планировка» (class hint / `data-*` / соседний текстовый label «Планировка»). 2. Расширить `_TextCollector` (или добавить отдельный лёгкий regex-pass по сырому HTML, не трогая существующую text-логику) — извлечь `plan_image_url` из `parse_catalog_flat()`. 3. Реализовать реальный `download_plan_image()` (заменить `download_plan_image_stub` в `flat_plans.py`) — Celery task, httpx GET, запись `local_path`/`width_px`/`height_px`/`size_bytes` через уже готовый `upsert_flat_plans()`. 4. Вызвать `download_plan_image()` из существующего `scrape_one_flat()` / `scrape_catalog_batch()` (domrf_catalog.py) — **не заводить новый beat-schedule**, просто довесить к уже идущему прогону. 5. Rate-limit / retry — переиспользовать существующий паттерн catalog-скрапера (уже settled для 983k квартир). ## Acceptance criteria - [ ] `domrf_kn_flat_plans` растёт по мере прохода уже идущего catalog-скрапера (не отдельный backfill-джоб) - [ ] ≥100 реальных планировок скачаны и лежат в `local_path` в течение суток после деплоя (наблюдаемо через freshness/count-запрос) - [ ] Не сломан существующий price/status/finishing-парсинг (`parse_catalog_flat` regression — прогнать `test_domrf_catalog_parse.py`) ## Out of scope - ❌ Potrace-векторизация (#299 production-wiring) — отдельный PR после того как наберётся выборка - ❌ CubiCasa (#300) — заблокировано до факта нехватки Potrace ## Estimated effort ~1 день (S). Единственный домен — backend/scrapers, без миграций (таблица уже есть). Refs #300, #299
Sign in to join this conversation.
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#2440
No description provided.