refactor(scraper-kit): unify price bisection engine across providers + dedup (#2134) #2168

Merged
lekss361 merged 1 commit from feat/scraper-kit-consolidate-bisection into main 2026-07-02 16:41:05 +00:00
Owner

Закрывает #2134 (Epic #2126, шаг E). Консолидация внутри пакета, боевые app/services/scrapers/* НЕ тронуты, инертно.

Главное: единый движок бисекции

scraper_kit/pricing/bisection.py (walk_price_range + BisectionConfig + ProbeFailPolicy) — 4 независимые копии рекурсии комнатность×цена заменены вызовом общего движка (провайдер даёт probe/on_leaf/on_degraded + конфиг). Арифметика деления в одном месте (grep mid = ( в providers пуст).

Различия 4 реализаций закодированы в конфиг (ничего не потеряно)

поле avito cian yandex domclick
cap 1400 1400 500 2000
min_bracket 50k 50k 500k 100k
граница > (строго)
probe-fail SPLIT_OR_SKIP SKIP DEGRADE count-endpoint
открытый брекет leaf leaf leaf делится

(yandex min_bracket = 500k — старый _YANDEX_MIN_BRACKET 50k был мёртвым дублем)

Заодно

  • house_type дедуп: yandex/shared.py → re-export из core (карта сверена идентична)
  • Латентный BrowserFetcher без endpoint — пофикшен в avito/serp.py, cian/serp.py, yandex/serp.py (все class-instance)

Golden-parity (8 тестов, все 4 провайдера)

Старый боевой app.services.scrapers.<provider> ≡ новый движок на детерминированном оракуле счётчиков — точная последовательность probe/leaf/split/zero/degrade событий. 53 passed total.

Follow-up (не в этом PR)

  • avito session-builder ×4 — НЕ идентичны (serp/detail полная сессия vs houses/imv минимальная), нужен параметризованный хелпер
  • BrowserFetcher endpoint в cian/newbuilding.py, yandex/newbuilding.py — те же латентные баги, требуют протаскивания endpoint через сигнатуры

Verify

  • боевые не тронуты (git status пуст); grep from app в kit пусто; ruff/mypy чисто
Закрывает #2134 (Epic #2126, шаг E). Консолидация внутри пакета, боевые `app/services/scrapers/*` НЕ тронуты, инертно. ## Главное: единый движок бисекции `scraper_kit/pricing/bisection.py` (`walk_price_range` + `BisectionConfig` + `ProbeFailPolicy`) — 4 независимые копии рекурсии комнатность×цена заменены вызовом общего движка (провайдер даёт `probe`/`on_leaf`/`on_degraded` + конфиг). Арифметика деления в одном месте (grep `mid = (` в providers пуст). ## Различия 4 реализаций закодированы в конфиг (ничего не потеряно) | поле | avito | cian | yandex | domclick | |---|---|---|---|---| | cap | 1400 | 1400 | 500 | 2000 | | min_bracket | 50k | 50k | 500k | 100k | | граница | ≥ | ≥ | ≥ | > (строго) | | probe-fail | SPLIT_OR_SKIP | SKIP | DEGRADE | count-endpoint | | открытый брекет | leaf | leaf | leaf | делится | (yandex `min_bracket` = 500k — старый `_YANDEX_MIN_BRACKET` 50k был мёртвым дублем) ## Заодно - `house_type` дедуп: yandex/shared.py → re-export из core (карта сверена идентична) - **Латентный `BrowserFetcher` без `endpoint`** — пофикшен в `avito/serp.py`, `cian/serp.py`, `yandex/serp.py` (все class-instance) ## Golden-parity ✅ (8 тестов, все 4 провайдера) Старый боевой `app.services.scrapers.<provider>` ≡ новый движок на детерминированном оракуле счётчиков — точная последовательность probe/leaf/split/zero/degrade событий. 53 passed total. ## Follow-up (не в этом PR) - avito session-builder ×4 — НЕ идентичны (serp/detail полная сессия vs houses/imv минимальная), нужен параметризованный хелпер - `BrowserFetcher` endpoint в `cian/newbuilding.py`, `yandex/newbuilding.py` — те же латентные баги, требуют протаскивания endpoint через сигнатуры ## Verify - боевые не тронуты (git status пуст); grep `from app` в kit пусто; ruff/mypy чисто
lekss361 added 1 commit 2026-07-02 16:40:37 +00:00
refactor(scraper-kit): unify price bisection engine across providers + dedup (#2134)
All checks were successful
CI / changes (pull_request) Successful in 10s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
5dc830fb26
lekss361 merged commit 62fa1f732a into main 2026-07-02 16:41:05 +00:00
lekss361 deleted branch feat/scraper-kit-consolidate-bisection 2026-07-02 16:41:05 +00:00
Sign in to join this conversation.
No reviewers
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#2168
No description provided.