Avito detail-enrichment backfill для legacy listings (detail_enriched_at IS NULL) — прокси уже есть #1551

Closed
opened 2026-06-16 07:25:50 +00:00 by lekss361 · 1 comment
Owner

Исправление (was: ошибочно помечено needs-human/«нужны прокси»)

Первоначальная формулировка была неверной — она утверждала, что низкое detail-покрытие = anti-bot-стена и нужно «решение по прокси». Это не так. Мобильный прокси Avito уже задеплоен и работает (runbook avito_mobile_proxy.md, PR #788 SERP + #805 shared-session: SERP+detail+houses через прокси, verified на проде 2026-05-30: detail-страница отдаёт HTTP 200 через прокси, ротация IP через changeip). Снял needs-human + blocked.

Реальная проблема (verified прод 2026-06-16)

Detail-only поля заполнены лишь у ~3-4% avito-объявлений ВСЕГО, НО это legacy backlog skew, не активная стена:

  • listings WHERE source='avito': total 15917, detail_enriched_at заполнен 674, detail_enriched_at IS NULL = 15243 (96%).
  • Свежие дни обогащаются нормально: 2026-06-16 → 11/12 (92%), 2026-06-15 → 33/187 (18%). Т.е. прокси-путь работает.
  • Причина backlog: scrape_pipeline.py Stage 5 ENRICH_DETAIL выбирает только top-N со свойствами detail_enriched_at IS NULL AND (близко к anchor свипа OR scraped < 2h). Старые объявления, далёкие от текущего anchor и старше 2ч, никогда не переобогащаются → 15243 застряли с NULL.

Это прямой аналог geocode-gap из PR #1549 (там не было крона, догоняющего legacy listings без координат). Тот же паттерн решения.

Предлагаемый фикс (backend, без needs-human)

Detail-enrichment backfill, проходящий legacy detail_enriched_at IS NULL через прокси, аналогично run_geocode_missing_listings / yandex_address_backfill:

  • новый scheduler-source (e.g. avito_detail_backfill) + trigger + scrape_schedules seed-миграция;
  • task: батч из N объявлений detail_enriched_at IS NULL (приоритет active + свежие) → fetch_detail через тот же прокси-путь, что и pipeline (scrape_pipeline._avito_proxies()), с ротацией IP на блок; wall-clock budget на прогон;
  • ставить detail_enriched_at = NOW() ВСЕГДА (успех/блок), чтобы backoff и не зацикливаться (как geocode_tried_at в #1549);
  • мягкий abort: ротировать IP и продолжать, не валить весь run на 3 блока (в отличие от inline-стадии свипа).

Эффект

Покрыло бы СРАЗУ две дыры: detail-координаты (data-map-lat/lon, точнее geocode-fallback) И поля квартир (living_area/repair_state/etc, см. PR #1550). Объём: 15243 × browser-fetch — тяжело, нужен троттлинг + budget; прокси 1 IP/порт (ротация ~9с) → backfill идёт медленно, фоном по ночам.

Зависимости / связано

  • PR #1549 (geocode-missing backfill) — уже покрывает координаты по адресу для всех source.
  • PR #1550 (avito detail field-map) — нужен, чтобы backfill сохранял новые поля.
  • runbook avito_mobile_proxy.md, PR #788/#805/#806.
## Исправление (was: ошибочно помечено needs-human/«нужны прокси») ❌ Первоначальная формулировка была неверной — она утверждала, что низкое detail-покрытие = anti-bot-стена и нужно «решение по прокси». **Это не так.** Мобильный прокси Avito уже задеплоен и работает (runbook `avito_mobile_proxy.md`, PR #788 SERP + **#805 shared-session: SERP+detail+houses через прокси**, verified на проде 2026-05-30: detail-страница отдаёт HTTP 200 через прокси, ротация IP через changeip). Снял `needs-human` + `blocked`. ## Реальная проблема (verified прод 2026-06-16) Detail-only поля заполнены лишь у ~3-4% avito-объявлений ВСЕГО, НО это **legacy backlog skew**, не активная стена: - `listings WHERE source='avito'`: total **15917**, `detail_enriched_at` заполнен **674**, **`detail_enriched_at IS NULL` = 15243 (96%)**. - **Свежие дни** обогащаются нормально: 2026-06-16 → 11/12 (92%), 2026-06-15 → 33/187 (18%). Т.е. прокси-путь работает. - Причина backlog: `scrape_pipeline.py` Stage 5 ENRICH_DETAIL выбирает только top-N со свойствами `detail_enriched_at IS NULL AND (близко к anchor свипа OR scraped < 2h)`. Старые объявления, далёкие от текущего anchor и старше 2ч, **никогда не переобогащаются** → 15243 застряли с NULL. Это **прямой аналог** geocode-gap из PR #1549 (там не было крона, догоняющего legacy listings без координат). Тот же паттерн решения. ## Предлагаемый фикс (backend, без needs-human) Detail-enrichment backfill, проходящий legacy `detail_enriched_at IS NULL` через прокси, аналогично `run_geocode_missing_listings` / `yandex_address_backfill`: - новый scheduler-source (e.g. `avito_detail_backfill`) + trigger + scrape_schedules seed-миграция; - task: батч из N объявлений `detail_enriched_at IS NULL` (приоритет active + свежие) → `fetch_detail` через тот же прокси-путь, что и pipeline (`scrape_pipeline._avito_proxies()`), с ротацией IP на блок; wall-clock budget на прогон; - ставить `detail_enriched_at = NOW()` ВСЕГДА (успех/блок), чтобы backoff и не зацикливаться (как `geocode_tried_at` в #1549); - мягкий abort: ротировать IP и продолжать, не валить весь run на 3 блока (в отличие от inline-стадии свипа). ## Эффект Покрыло бы СРАЗУ две дыры: detail-координаты (`data-map-lat/lon`, точнее geocode-fallback) И поля квартир (living_area/repair_state/etc, см. PR #1550). Объём: 15243 × browser-fetch — тяжело, нужен троттлинг + budget; прокси 1 IP/порт (ротация ~9с) → backfill идёт медленно, фоном по ночам. ## Зависимости / связано - PR #1549 (geocode-missing backfill) — уже покрывает координаты по адресу для всех source. - PR #1550 (avito detail field-map) — нужен, чтобы backfill сохранял новые поля. - runbook `avito_mobile_proxy.md`, PR #788/#805/#806.
lekss361 added the
needs-human
scope/backend
scrapers
labels 2026-06-16 07:26:05 +00:00
lekss361 changed title from Avito detail-enrichment покрывает только ~2-3% объявлений — anti-bot обрыв на server-IP to Avito detail-enrichment backfill для legacy listings (detail_enriched_at IS NULL) — прокси уже есть 2026-06-16 08:30:06 +00:00
lekss361 added
enhancement
and removed
needs-human
labels 2026-06-16 08:30:11 +00:00
Author
Owner

Задеплоено + verified на проде 2026-06-16 (PR #1552)

  • Миграция 112 применена, scrape_schedules.avito_detail_backfill enabled, окно 9-12 UTC, next_run 2026-06-17 09:00.
  • Scheduler крутится в контейнере tradein-scraper (scheduler_main, tick 60s; в tradein-backend SCHEDULER_ENABLE=false намеренно).
  • Smoke-прогон (run_id=96, batch=20/budget=150с): attempted=5, enriched=5, blocked=0, failed=0 — прокси-путь (browser/camoufox через tradein-browser) работает, не банится. detail_enriched_at IS NULL: 15243→15238.

⚠️ Follow-up: скорость

Browser-fetch ~30с/объявление (camoufox-рендер + delay). При budget=9000с (поднял с 3600) ночной прогон ≈ 300 объявлений → 15238 legacy ≈ ~50 ночей. Приемлемо как фон, но если нужно быстрее — рассмотреть cffi-mode для detail-backfill (без browser-рендера, ~3-5с/шт, ×10): прокси работает и для cffi (SERP идёт cffi через прокси с #806). Это отдельная оптимизация, не блокер — backfill уже идёт.

## Задеплоено + verified на проде 2026-06-16 (PR #1552) - Миграция 112 применена, `scrape_schedules.avito_detail_backfill` enabled, окно 9-12 UTC, next_run 2026-06-17 09:00. - Scheduler крутится в контейнере **`tradein-scraper`** (`scheduler_main`, tick 60s; в `tradein-backend` SCHEDULER_ENABLE=false намеренно). - **Smoke-прогон (run_id=96, batch=20/budget=150с):** attempted=5, **enriched=5, blocked=0, failed=0** — прокси-путь (browser/camoufox через tradein-browser) работает, не банится. `detail_enriched_at IS NULL`: 15243→15238. ## ⚠️ Follow-up: скорость Browser-fetch ~**30с/объявление** (camoufox-рендер + delay). При budget=9000с (поднял с 3600) ночной прогон ≈ 300 объявлений → 15238 legacy ≈ **~50 ночей**. Приемлемо как фон, но если нужно быстрее — рассмотреть **cffi-mode для detail-backfill** (без browser-рендера, ~3-5с/шт, ×10): прокси работает и для cffi (SERP идёт cffi через прокси с #806). Это отдельная оптимизация, не блокер — backfill уже идёт.
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#1551
No description provided.