feat(scrapers): подключить flat-level catalog scraper в Celery + прокинуть catalog_url_hash #2442

Open
opened 2026-07-05 16:08:26 +00:00 by bot-backend · 1 comment
Collaborator

Контекст

PR #2441 (issue #2440) реализовал извлечение + скачивание plan_image_url внутри scrape_one_flat/scrape_catalog_batch (domrf_catalog.py) — но эти функции ship inert: они нигде не вызываются из Celery. Чтобы domrf_kn_flat_plans реально начала наполняться, нужны два независимых прод-фикса.

Важно — при реализации #2440 агент ошибочно заявил "ни в одном gendesign-контейнере нет Playwright". Я перепроверил напрямую: Playwright + Chrome for Testing 145.0.7632.6 установлены в gendesign-worker-1 (/opt/playwright/chromium-1208/chrome-linux64/chrome). Devops-работы по образу не требуется — это не блокер.

Проверенные факты (2026-07-05, прямой SQL + grep на проде)

Утверждение Статус
domrf_catalog.py вызывается из Celery Нет — grep -rn domrf_catalog backend/app/workers/ пусто
catalog_url_hash заполнен 0/983 088 — жёстко None в UPSERT-словаре domrf_kn.py:479 с комментарием "заполнит catalog scraper 22d"
elemId (нужный хэш) доступен в payload Да — читается в domrf_kn.py:430 (elem = _g(row, "elemId")), просто не прокидывается в catalog_url_hash
Playwright установлен в worker Да (проверено напрямую, вопреки первоначальному заявлению)

Scope

  1. domrf_kn.py: прокинуть уже читаемый elem (elemId) в catalog_url_hash вместо жёсткого None (строка ~479) — тривиальный однострочный фикс, разблокирует источник хэшей для 983k квартир разом при следующем прогоне kn-sweep.
  2. Новый Celery task (по образцу scrape_kn_catalog_objects.py) — обёртка над scrape_catalog_batch, батчит по obj_id где catalog_url_hash IS NOT NULL, с тем же rate-limit паттерном, что уже settled для object-level scraper.
  3. Валидация pageProps-ключа на живой странице#2441 реализовал extraction по лучшей догадке (__NEXT_DATA__ pageProps, WAF заблокировал живую проверку с IP агента). После первого реального прогона — проверить логи/выборку, что plan_image_url реально находится не в 0% случаев; при необходимости уточнить _NEXT_PLAN_KEY_RE.

Acceptance criteria

  • catalog_url_hash растёт при следующем прогоне kn-sweep (не 0/983088)
  • Новый Celery task зарегистрирован в beat/queue, прогоняется на batch реальных квартир
  • domrf_kn_flat_plans растёт (≥100 строк с непустым local_path в течение суток после первого прогона)
  • Если plan_image_url находится в 0% выборки — зафиксировать реальный HTML-паттерн и поправить regex, не заливать вслепую

Estimated effort

M (2-3 дня): backend fix (S) + новый Celery task с rate-limit (M) + validation pass (S).

Refs #2440, #2441, #299, #300

## Контекст PR #2441 (issue #2440) реализовал извлечение + скачивание `plan_image_url` внутри `scrape_one_flat`/`scrape_catalog_batch` (`domrf_catalog.py`) — но эти функции **ship inert**: они нигде не вызываются из Celery. Чтобы `domrf_kn_flat_plans` реально начала наполняться, нужны два независимых прод-фикса. **Важно** — при реализации #2440 агент ошибочно заявил "ни в одном gendesign-контейнере нет Playwright". Я перепроверил напрямую: **Playwright + Chrome for Testing 145.0.7632.6 установлены** в `gendesign-worker-1` (`/opt/playwright/chromium-1208/chrome-linux64/chrome`). Devops-работы по образу **не требуется** — это не блокер. ## Проверенные факты (2026-07-05, прямой SQL + grep на проде) | Утверждение | Статус | |---|---| | `domrf_catalog.py` вызывается из Celery | ❌ Нет — `grep -rn domrf_catalog backend/app/workers/` пусто | | `catalog_url_hash` заполнен | ❌ 0/983 088 — жёстко `None` в UPSERT-словаре domrf_kn.py:479 с комментарием "заполнит catalog scraper 22d" | | `elemId` (нужный хэш) доступен в payload | ✅ Да — читается в `domrf_kn.py:430` (`elem = _g(row, "elemId")`), просто не прокидывается в `catalog_url_hash` | | Playwright установлен в worker | ✅ Да (проверено напрямую, вопреки первоначальному заявлению) | ## Scope 1. **`domrf_kn.py`**: прокинуть уже читаемый `elem` (elemId) в `catalog_url_hash` вместо жёсткого `None` (строка ~479) — тривиальный однострочный фикс, разблокирует источник хэшей для 983k квартир разом при следующем прогоне kn-sweep. 2. **Новый Celery task** (по образцу `scrape_kn_catalog_objects.py`) — обёртка над `scrape_catalog_batch`, батчит по `obj_id` где `catalog_url_hash IS NOT NULL`, с тем же rate-limit паттерном, что уже settled для object-level scraper. 3. **Валидация pageProps-ключа на живой странице** — #2441 реализовал extraction по лучшей догадке (`__NEXT_DATA__` pageProps, WAF заблокировал живую проверку с IP агента). После первого реального прогона — проверить логи/выборку, что `plan_image_url` реально находится не в 0% случаев; при необходимости уточнить `_NEXT_PLAN_KEY_RE`. ## Acceptance criteria - [ ] `catalog_url_hash` растёт при следующем прогоне kn-sweep (не 0/983088) - [ ] Новый Celery task зарегистрирован в beat/queue, прогоняется на batch реальных квартир - [ ] `domrf_kn_flat_plans` растёт (≥100 строк с непустым `local_path` в течение суток после первого прогона) - [ ] Если `plan_image_url` находится в 0% выборки — зафиксировать реальный HTML-паттерн и поправить regex, не заливать вслепую ## Estimated effort M (2-3 дня): backend fix (S) + новый Celery task с rate-limit (M) + validation pass (S). Refs #2440, #2441, #299, #300
Author
Collaborator

Код смёржен и задеплоен — PR #2444, прод на 5b3799a2, backend/worker/beat здоровы (verified).

Оставляю issue открытым — acceptance criteria не выполнены полностью по дизайну:

  • catalog_url_hash propagation — код есть, но растёт только после следующего kn-sweep (не проверял, надо подождать обычного расписания)
  • Celery task зарегистрирован — но beat-запись намеренно закомментирована, ручной триггер требует авторизации
  • domrf_kn_flat_plans пока не растёт и не будет расти, пока не решится #2443 (WAF cooldown)

Блокер на закрытие — #2443. Как только там будет решение (targeted test / прокси / что угодно) — можно либо включить beat-запись здесь, либо закрыть issue как "код готов, включение отложено осознанно".

Код смёржен и задеплоен — PR #2444, прод на `5b3799a2`, backend/worker/beat здоровы (verified). Оставляю issue открытым — acceptance criteria не выполнены полностью по дизайну: - ✅ `catalog_url_hash` propagation — код есть, но растёт только после следующего kn-sweep (не проверял, надо подождать обычного расписания) - ✅ Celery task зарегистрирован — но beat-запись **намеренно закомментирована**, ручной триггер требует авторизации - ❌ `domrf_kn_flat_plans` пока не растёт и не будет расти, пока не решится #2443 (WAF cooldown) Блокер на закрытие — #2443. Как только там будет решение (targeted test / прокси / что угодно) — можно либо включить beat-запись здесь, либо закрыть issue как "код готов, включение отложено осознанно".
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#2442
No description provided.