perf(tradein): shared EKB seed price-brackets across avito/cian/yandex (city-dict ready for multi-city) #1760

Merged
lekss361 merged 1 commit from perf/shared-price-brackets-cian-yandex into main 2026-06-18 14:57:42 +00:00
Owner

Задача

Вынести EKB seed price-brackets (из #1759, avito) в ОБЩИЙ констант и применить ко ВСЕМ exhaustive-скрапперам — единообразие ≤2к-блоков + открытый верх + полнота на cian/yandex. Структура — city-dict, готова под per-city (multi-city: Москва пик 15-40М, Тюмень иные — см. vault decisions/Decision_Price_Brackets_Per_City).

Изменения

  • scrapers/price_brackets.py (нов) — get_price_seed_brackets(city='ekaterinburg') + CITY_PRICE_SEED_BRACKETS city-dict + _EKB_SECONDARY (11 брекетов, последний (250М, None) открытый).
  • avito.py — локальный литерал заменён на _AVITO_PRICE_SEED_BRACKETS = get_price_seed_brackets() (тот же набор, loop без изменений). Поведение идентично — 23 avito-exhaustive теста зелёные без правок.
  • cian.pyfetch_all_secondary теперь идёт по seed-сетке (вместо single-root [0,_MAX]); _walk_price_range получил hi: int | None + open-top guard; leaf-пагинация вынесена в _paginate_leaf_bucket (+_paginate_open_bucket).
  • yandex_realty.py — exhaustive fetch_all_secondary на seed-сетку; _walk_price_range hi: int|None + no-split open-path.

Важно: yandex — применено к ПРАВИЛЬНОМУ пути

Премиса задачи (yandex использует DEFAULT_PRICE_RANGES для exhaustive) неверна. yandex exhaustive-путь был single-root бисекцией (как старый cian), БЕЗ seed-сетки. DEFAULT_PRICE_RANGES питает отдельный gate-combo fetch_around_multi_room (→ scrape_pipeline city-sweep, off-limits + city-sweep-тесты). Поэтому seed-сетка применена к yandex exhaustive (fetch_all_secondary), а DEFAULT_PRICE_RANGES намеренно сохранён (его правка сломала бы city-sweep). Формат-адаптация тривиальна — yandex _build_url/_fetch_page_json уже принимают price_max: int|None и опускают priceMax при None.

Тесты

Full suite: 2000 passed, 1 skipped, 0 failed. Новый test_price_brackets.py; обновлён test_cian_exhaustive.py (+open-bracket); +2 yandex-теста. Ruff clean.

Примечания ревью

  • avito поведение не изменилось (тот же набор брекетов, подтверждено).
  • Merge может конфликтнуть с in-flight WIP в yandex_realty.py (другое окно) — ожидаемо, разрулит owner WIP. Ветка с чистого main, yandex-тесты зелёные.
  • _MAX_PRICE/_AVITO_MAX_PRICE/_YANDEX_MAX_PRICE сохранены (ссылки в тестах/докстрингах).
## Задача Вынести EKB seed price-brackets (из #1759, avito) в ОБЩИЙ констант и применить ко ВСЕМ exhaustive-скрапперам — единообразие ≤2к-блоков + открытый верх + полнота на cian/yandex. Структура — city-dict, готова под per-city (multi-city: Москва пик 15-40М, Тюмень иные — см. vault `decisions/Decision_Price_Brackets_Per_City`). ## Изменения - **`scrapers/price_brackets.py`** (нов) — `get_price_seed_brackets(city='ekaterinburg')` + `CITY_PRICE_SEED_BRACKETS` city-dict + `_EKB_SECONDARY` (11 брекетов, последний `(250М, None)` открытый). - **`avito.py`** — локальный литерал заменён на `_AVITO_PRICE_SEED_BRACKETS = get_price_seed_brackets()` (тот же набор, loop без изменений). **Поведение идентично** — 23 avito-exhaustive теста зелёные без правок. - **`cian.py`** — `fetch_all_secondary` теперь идёт по seed-сетке (вместо single-root `[0,_MAX]`); `_walk_price_range` получил `hi: int | None` + open-top guard; leaf-пагинация вынесена в `_paginate_leaf_bucket` (+`_paginate_open_bucket`). - **`yandex_realty.py`** — exhaustive `fetch_all_secondary` на seed-сетку; `_walk_price_range` `hi: int|None` + no-split open-path. ## Важно: yandex — применено к ПРАВИЛЬНОМУ пути Премиса задачи (yandex использует `DEFAULT_PRICE_RANGES` для exhaustive) **неверна**. yandex exhaustive-путь был single-root бисекцией (как старый cian), БЕЗ seed-сетки. `DEFAULT_PRICE_RANGES` питает отдельный **gate-combo** `fetch_around_multi_room` (→ `scrape_pipeline` city-sweep, off-limits + city-sweep-тесты). Поэтому seed-сетка применена к yandex **exhaustive** (`fetch_all_secondary`), а `DEFAULT_PRICE_RANGES` **намеренно сохранён** (его правка сломала бы city-sweep). Формат-адаптация тривиальна — yandex `_build_url`/`_fetch_page_json` уже принимают `price_max: int|None` и опускают priceMax при None. ## Тесты Full suite: **2000 passed, 1 skipped, 0 failed**. Новый `test_price_brackets.py`; обновлён `test_cian_exhaustive.py` (+open-bracket); +2 yandex-теста. Ruff clean. ## Примечания ревью - avito поведение не изменилось (тот же набор брекетов, подтверждено). - Merge может конфликтнуть с in-flight WIP в `yandex_realty.py` (другое окно) — ожидаемо, разрулит owner WIP. Ветка с чистого main, yandex-тесты зелёные. - `_MAX_PRICE`/`_AVITO_MAX_PRICE`/`_YANDEX_MAX_PRICE` сохранены (ссылки в тестах/докстрингах).
lekss361 added 1 commit 2026-06-18 14:57:15 +00:00
perf(tradein): shared EKB seed price-brackets across avito/cian/yandex (city-dict ready for multi-city)
All checks were successful
CI / changes (pull_request) Successful in 7s
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
ffecc6962d
lekss361 added the
enhancement
scope/backend
scrapers
status/review
labels 2026-06-18 14:57:24 +00:00
lekss361 merged commit e05e81f654 into main 2026-06-18 14:57:42 +00:00
lekss361 deleted branch perf/shared-price-brackets-cian-yandex 2026-06-18 14:57:42 +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#1760
No description provided.