feat(tradein): avito exhaustive full-load (room×price bisection) — mirror cian #1753
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
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#1753
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/avito-exhaustive-fullload"
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?
Проблема
Avito вторичка катастрофически недобрана: 643 active из 15918 total (4%). Anchor/citywide-стратегия упирается в Avito SERP-cap ~5000 (100 стр × 50) и теряет хвост. Эталон полноты — cian/yandex с exhaustive-бисекцией КОМНАТНОСТЬ×ЦЕНА (cian #926/#929/#930/#938, yandex). У avito такого загрузчика НЕ было.
Решение
Зеркало cian
run_cian_full_loadдля avito: рекурсивная адаптивная бинарная бисекция ценового диапазона внутри каждой комнатности → полное покрытие citywide без anchor-мозаики и SERP-cap.Эмпирически подтверждено (зонд живого avito через прод camoufox-пул, apw-egress):
pmin/pmaxработают (фильтр 3-4 млн → 1178 результатов);data-marker="page-title/count"span (1 178→ 1178) — аналог ciantotalOffers, надёжен → fixed-grid fallback не нужен;item-development-name(novostroyki vs vtorichka) →secondary_onlyработает идентично cian.Изменения
scrapers/avito.py—pmin/pmaxв_build_rooms_url(backward-compat);_extract_total_count(парсpage-title/count, None на captcha);fetch_all_secondary+_walk_price_range(рекурсивная бисекция, leaf parallel-paginate через Semaphore, dedup по source_id, on_bucket incremental callback, skip_buckets resume, secondary_only, IP-rotate+retry на total=None, переиспользует_fetch_serp_htmlanti-block). Константы_AVITO_MAX_PRICE/_AVITO_MIN_BRACKET/_AVITO_OFFERS_PER_PAGE/_AVITO_DEFAULT_ROOMS(7 комнатностей вкл. студии/своб.планир.).scrape_pipeline.py—AvitoFullLoadCounters+run_avito_full_load(incremental on_bucket save, done_buckets resume, cooperative cancel, heartbeat;AvitoBlockedError/RateLimited→mark_bannedс сохранением partial).scheduler.py— import,trigger_avito_full_load_run, dispatchelif source == "avito_full_load", docstring-registry.data/sql/127_scrape_schedules_seed_avito_full_load.sql— idempotent seed (enabled=true, окно 13-15 UTC — не конфликтует на apw-прокси с avito_city_sweep 6-7 / newbuilding 2-5 / detail_backfill 9-12;ON CONFLICT DO UPDATEбез затирания enabled).tests/scrapers/test_avito_exhaustive.py(+) — URL pmin/pmax,_extract_total_count(real-span1\xa0178→1178, captcha→None, 0→0), бисекция (split/paginate/min-bracket-guard/dedup/skip/secondary_only/cancel).tests/test_scheduler.py— avito_full_load dispatch.Тесты
Full suite (prescribed deselects): 1963 passed, 1 skipped, 0 failed (~20s). Изолированный worktree чист — yandex-WIP-шума нет. Ruff clean.
Прод-смоук после merge
UPDATE scrape_schedules SET next_run_at=now() WHERE source='avito_full_load'→ scheduler вtradein-scraperподхватит ≤60с → сравнить avito vtorichka active ДО (643) / ПОСЛЕ (ожидается десятки тысяч). Сверить с эталоном cian full_load (#46: 29511 уникальных за 25 мин).✅ APPROVE — reviewed on clean worktree at head
1ddbf867(мирроринг только что смерженного cian #1752).Проверено (7 концернов):
trigger_avito_full_load_run — зеркало cian: _claim_run advisory-xact-lock (дубль-ран исключён), все 4 параметра проброшены, resume_run_id=None, dispatch elif корректен.
Тесты на чистом дереве: 1963 passed, 1 skipped, 0 failed (2 cache-теста deselected per gate). Ruff clean. yandex-WIP-шума нет.
Merge (merge style).