scraper-kit E: консолидация бисекции цены (4 копии → pricing/bisection.py) #2134

Closed
opened 2026-07-02 13:40:37 +00:00 by lekss361 · 1 comment
Owner

Часть Epic #2126, шаг E. Depends: шаг D (providers-move). Активировать после merge D.

Goal

Свести 4 независимые реализации адаптивной бисекции комнатность×цена в единый движок scraper_kit/pricing/bisection.py (strategy: probe_fn/paginate_fn/config). Заодно вынести avito-дубли session-builder (×4) в providers/avito/_shared.py.

Копии:

  • avito.py:1110 (_walk_price_range)
  • cian.py:355-536
  • yandex_realty.py:844-1069
  • domclick.py:340-402 (через count-endpoint, свои константы, не использует get_price_seed_brackets)

Расхождения констант: _MIN_BRACKET 50k / 500k(мёртвый дубль yandex_realty.py:992) / 100k(domclick).

Acceptance

  • Одна реализация бисекции (grep подтверждает)
  • Различия провайдеров вынесены в per-provider config, НЕ потеряны
  • Golden-тест: результат бисекции идентичен дореформенному на fixtures каждого провайдера

Risk

4 реализации РАЗОШЛИСЬ — НЕ сливать наугад. Сначала diff семантики каждой (bracket seed, split-порог, open/closed-ветки), вынести в конфиг, потом unify.

Agent: backend-engineer

Часть Epic #2126, шаг E. ⛔ Depends: шаг D (providers-move). Активировать после merge D. ## Goal Свести 4 независимые реализации адаптивной бисекции комнатность×цена в единый движок `scraper_kit/pricing/bisection.py` (strategy: `probe_fn`/`paginate_fn`/config). Заодно вынести avito-дубли session-builder (×4) в `providers/avito/_shared.py`. Копии: - `avito.py:1110` (`_walk_price_range`) - `cian.py:355-536` - `yandex_realty.py:844-1069` - `domclick.py:340-402` (через count-endpoint, свои константы, не использует `get_price_seed_brackets`) Расхождения констант: `_MIN_BRACKET` 50k / 500k(мёртвый дубль yandex_realty.py:992) / 100k(domclick). ## Acceptance - Одна реализация бисекции (grep подтверждает) - Различия провайдеров вынесены в per-provider config, НЕ потеряны - Golden-тест: результат бисекции идентичен дореформенному на fixtures каждого провайдера ## Risk 4 реализации РАЗОШЛИСЬ — НЕ сливать наугад. Сначала diff семантики каждой (bracket seed, split-порог, open/closed-ветки), вынести в конфиг, потом unify. **Agent:** backend-engineer
lekss361 added the
priority/p2
scope/backend
scrapers
tech-debt
tradein
labels 2026-07-02 13:41:55 +00:00
lekss361 added the
status/ready
status/wip
labels 2026-07-02 16:14:16 +00:00
Author
Owner

Смержено (PR #2168). Единый движок бисекции pricing/bisection.py — 4 копии заменены, различия в per-provider config, golden-parity 8 тестов зелёные. Заодно: house_type дедуп + латентный BrowserFetcher endpoint фикс в 3 serp. Инертно (боевые не тронуты).

Follow-up (мелкие, отдельно):

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

Оба низкоценные, доберу при rewire или отдельным chore.

Смержено (PR #2168). Единый движок бисекции `pricing/bisection.py` — 4 копии заменены, различия в per-provider config, golden-parity 8 тестов зелёные. Заодно: house_type дедуп + латентный `BrowserFetcher endpoint` фикс в 3 serp. Инертно (боевые не тронуты). **Follow-up (мелкие, отдельно):** 1. avito session-builder ×4 — НЕ идентичны (serp/detail полная vs houses/imv минимальная сессия), нужен параметризованный хелпер. 2. `BrowserFetcher endpoint` в `cian/newbuilding.py`, `yandex/newbuilding.py` — те же латентные баги, требуют протаскивания endpoint через сигнатуры. Оба низкоценные, доберу при rewire или отдельным chore.
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#2134
No description provided.