feat(scrapers): ночной avito detail-enrichment backfill для legacy listings (Closes #1551) #1552
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#1552
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/avito-detail-backfill"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Проблема (Closes #1551)
15243/15917 avito-объявлений имеют
detail_enriched_at IS NULL— никогда не обогащались detail-страницей. Свип (scrape_pipelineStage 5 ENRICH_DETAIL) берёт только fresh/proximate top-N → legacy застревают. Прокси Avito уже работает (#788/#805, runbookavito_mobile_proxy.md) — это не anti-bot стена, а отсутствие backfill. Прямой аналог geocode-gap (PR #1549).Фикс
Ночной backfill, проходящий legacy через тот же прокси-путь, что и pipeline. Паттерн — копия
geocode_missing_listings/yandex_address_backfill:app/tasks/avito_detail_backfill.py(new) —run_avito_detail_backfill(run_id, params):run_avito_pipeline(AsyncSession impersonate=chrome120 proxies=_avito_proxies(), либо browser-modeBrowserFetcher); own session/browser закрывается вfinally;detail_enriched_at IS NULL, приоритетis_active DESC, scraped_at DESC, LIMIT batch_size) → итерация по фикс-списку → гарантия завершения;fetch_detail→save_detail_enrichment(сам ставитdetail_enriched_at=NOW()при успехе);AvitoBlockedError/RateLimited:_rotate_ip()+consecutive_blocks++; послеmax_consecutive_blocks→ break +mark_done(НЕ failed — блок временный, объявление остаётся NULL → повтор след. прогон); счётчик сбрасывается только на успехе;budget_secguard;db.rollback()на ошибке (защита от aborted Session, #1368); run-lifecycle heartbeat/mark_done/mark_failed.app/services/scheduler.py—trigger_avito_detail_backfill_run(зеркало geocode-триггера) + dispatch elif.data/sql/112_scrape_schedules_seed_avito_detail_backfill.sql— seed enabled=true, окно 9-12 UTC (разнесено сavito_city_sweep~3-4 UTC, чтобы не делить прокси-IP одновременно),batch_size=800 budget_sec=3600 request_delay_sec=6 max_consecutive_blocks=5, idempotent.Эффект
Догонит 15243 legacy → точные
data-mapкоординаты (помимо geocode-fallback #1549) + поля квартир (living_area_m2/repair_state/ceiling_height_m/etc, поля захватываются после #1550). Параметры вdefault_paramsjsonb — тюнятся оператором без кода.Проверки
uv run pytest(полный suite, CI deselect): 1809 passed, 0 failures (7 новых).ruff check+ruff format --check: clean.start, двойнойtime.monotonic()).Зависимость
Миграция 112 (110/111 уже в main). Нет пересечения файлов с открытыми PR.