perf(tradein): avito seed price-brackets with open top bucket (≤2k blocks, no price ceiling) #1759
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#1759
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "perf/avito-seed-price-brackets"
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 exhaustive (
fetch_all_secondary) на каждую комнатность стартовал с корня[0, 200М]и делил пополам → ~5 холостых probe-спусков через пустой верх (квартиры ЕКБ почти все <16М):probe [0,100М]=6439 → [0,50М]=6439 → [0,25М]=6435…прежде чем начать делить. Каждый probe через camoufox ~12с → ~7 мин/прогон впустую. Прод: run 201 за ~40 мин не вышел из студий.Решение — data-driven seed-сетка (анализ прод-распределения вторички ЕКБ)
Структура: комнатность (slug) × ценовой брекет. Вместо корня
[0,_MAX]— проход по seed-брекетам, каждый дальше дробится_walk_price_rangeесли total > cap. Брекеты настроены под реальный пик 4-8М (студии 5783 — самая плотная, единственный >2к блок был студии 4-6М → пик дроблю по 1М):(млн руб). Закрытые брекеты —
hi-1(эксклюзивный верх, без overlap на границах). Последний брекет открытый (hi=None→ pmax не ставится → avito отдаёт всё ≥250М без потолка); он крошечный (avito >50М≈73) → пагинируется напрямую без бисекции (guard в_walk_price_range: приhi=Noneне делить).Зачем ≤2к (cap=2000): avito жёстко режет пагинацию на ~5000/запрос → бакет >5000 теряет хвост. ≤2к с запасом → полнота + чаще checkpoint (resume). Seed-сетка убирает холостой спуск (ускорение ~10-15%); основной объём (все листинги ÷50) неизбежен.
Изменения
scrapers/avito.py—_AVITO_PRICE_SEED_BRACKETS(11, открытый верх);fetch_all_secondaryloop по брекетам (hi-1 для закрытых); guardhi=Noneв_walk_price_range(probe pmax=None, пагинация без split); рефактор leaf-пагинации в_paginate_leaf_bucket(closed-path byte-for-byte сохранён).tests/scrapers/test_avito_exhaustive.py— call-count/args по брекетам, открытый брекет не делится даже при total>cap, dedup между брекетами, регресс.Тесты
Full suite: 1991 passed, 1 skipped, 0 failed. avito-exhaustive: 23 passed. Ruff clean.
Прод после деплоя
price_cap_per_bucket=2000уже в scrape_schedules. Запустить avito_full_load → в логах больше нет спуска[0,100M]→[0,50M]…; прогон проходит студии быстрее и доходит до всех 7 комнатностей. Глянуть что WARNING-путь открытого брекета (probe-fail → paginate 100 стр) не частит.