Регулярный сбор ДомКлика по Москве и области #3545

Merged
lekss361 merged 1 commit from feat/domclick-msk-sweeps into main 2026-09-17 04:46:38 +00:00
Owner

Зачем

Миграция 305 (#3541) завела регулярный сбор 77/50 для avito / cian / yandex и прямо отложила ДомКлик:

DomClick (≈23% корпуса обоих регионов) здесь НЕ заводится: у него нет wildcard-хендлера («domclick_city_sweep_*» отсутствует в _default_kit_handlers), а единственная возможная строка source='domclick_city_sweep' занята Екатеринбургом. Нужна правка кода — отдельной задачей.

Это она. Без ДомКлика свежий срез 77/50 теряет почти четверть массы, а вместе с ней — часть домов, по которым вообще существуют аналоги.

Wildcard заведён на обеих сторонах, и это не дубль

Продуктовый _job_domclick_city_sweep (app/services/product_handlers.py) перекрывает kit-native ради инъекции куки сессии Sber ID (#3264) — kit-native тело ходит на BFF без кук, потому что kit не имеет права читать БД.

Поставить wildcard только в _default_kit_handlers было бы тихой ошибкой: перекрытие осталось бы у ЕКБ (точный ключ) и молча пропало бы у регионов (wildcard), а московская строка упёрлась бы в QRATOR ровно так, как было до #3264. Поэтому запись есть и там, и там; продуктовый ключ по контракту build_registry перекрывает kit-native.

Новый тест test_domclick_region_wildcard_resolves_to_product_handler пинит именно эту развилку: domclick_city_sweep, domclick_city_sweep_moskva и domclick_city_sweep_moskovskaya_oblast обязаны резолвиться на продуктовый job.

Гео-скоуп

Задаёт ТОЛЬКО region_code. Профиль региона (providers/domclick/serp.py DOMCLICK_GEO_PROFILES) несёт address GUID, страницу прогрева QRATOR, bbox гарда и имя города; профили 77 и 50 заведены и проверены живыми запросами 12-15.09.2026 (#3533).

city_id в default_params намеренно не задан — он vestigial: run_domclick_city_sweep штампует город из профиля, а не из city_id. Неизвестный region_code роняет прогон ДО первого запроса — тихого отката на ЕКБ нет (это и был тот баг, ради которого гео-скоуп стал параметром).

Расписание (миграция 306)

source окно UTC region_code pages_per_anchor interval_days
domclick_city_sweep_moskva 0-3 77 100 3
domclick_city_sweep_moskovskaya_oblast 3-6 50 100 3
  • pages_per_anchor=100 — как у ЕКБ-строки. ДомКлик citywide, anchor-loop у него отсутствует (fetch_aroundNotImplementedError), «pages» здесь означает глубину пагинации на комнатный бакет. Москва отдаёт ≈23 690 лотов вторички — глубину надо брать полную, а не свипную.
  • Окна 0-3 и 3-6: миграция 305 заняла 16-23, ЕКБ-домклик сидит в 3-6. Прогоны всё равно сериализуются планировщиком, окно лишь ограничивает старт.
  • interval_days=3 — как у остальных строк 305: корпус живёт 14 суток (LISTINGS_FRESH_DAYS), трёхсуточный такт даёт четырёхкратный запас на пропуски из-за QRATOR-банов.
  • Включены сразу по той же причине, что и 305: регионы уходят тестировщикам, корпус истекает 26-27.09.
  • ON CONFLICT (source) DO NOTHING — повторный прогон no-op, не сбрасывает enabled, если строку потом выключили вручную.

Известный риск (не блокер этого PR)

Пул прокси истощён: живых 4 из 8 (id 1 — yandex-affinity, 13 и 14 — any, 15 — avito-affinity); id 9-12 выключены с 313-351 подряд неудачами. У ДомКлика affinity нет, он возьмёт «any», то есть будет конкурировать с cian за два узла. Первые прогоны 305 это уже показали: оба cian-прогона умерли за 0.1 с с no proxy available for provider='cian'. Расширение пула — отдельная задача; строки здесь корректны и начнут собирать, как только узлы появятся.

Тесты

tests/test_scraper_kit_scheduler_parity.py tests/test_3264_domclick_sweep_cookies.py tests/test_migration_numbering.py51 passed, 2 skipped. ruff check / ruff format чисто. Номер миграции сверен с forgejo/main через git ls-tree -r (последняя — 305).

🤖 Generated with Claude Code

https://claude.ai/code/session_01NQb6WeJtagZwZnUsSjDizs

## Зачем Миграция 305 (#3541) завела регулярный сбор 77/50 для avito / cian / yandex и прямо отложила ДомКлик: > DomClick (≈23% корпуса обоих регионов) здесь НЕ заводится: у него нет wildcard-хендлера («domclick_city_sweep_\*» отсутствует в `_default_kit_handlers`), а единственная возможная строка `source='domclick_city_sweep'` занята Екатеринбургом. Нужна правка кода — отдельной задачей. Это она. Без ДомКлика свежий срез 77/50 теряет почти четверть массы, а вместе с ней — часть домов, по которым вообще существуют аналоги. ## Wildcard заведён на обеих сторонах, и это не дубль Продуктовый `_job_domclick_city_sweep` (`app/services/product_handlers.py`) перекрывает kit-native ради инъекции куки сессии Sber ID (#3264) — kit-native тело ходит на BFF без кук, потому что kit не имеет права читать БД. Поставить wildcard только в `_default_kit_handlers` было бы тихой ошибкой: перекрытие осталось бы у ЕКБ (точный ключ) и молча пропало бы у регионов (wildcard), а московская строка упёрлась бы в QRATOR ровно так, как было до #3264. Поэтому запись есть и там, и там; продуктовый ключ по контракту `build_registry` перекрывает kit-native. Новый тест `test_domclick_region_wildcard_resolves_to_product_handler` пинит именно эту развилку: `domclick_city_sweep`, `domclick_city_sweep_moskva` и `domclick_city_sweep_moskovskaya_oblast` обязаны резолвиться на продуктовый job. ## Гео-скоуп Задаёт ТОЛЬКО `region_code`. Профиль региона (`providers/domclick/serp.py` `DOMCLICK_GEO_PROFILES`) несёт address GUID, страницу прогрева QRATOR, bbox гарда и имя города; профили 77 и 50 заведены и проверены живыми запросами 12-15.09.2026 (#3533). `city_id` в `default_params` намеренно не задан — он vestigial: `run_domclick_city_sweep` штампует город из профиля, а не из `city_id`. Неизвестный `region_code` роняет прогон ДО первого запроса — тихого отката на ЕКБ нет (это и был тот баг, ради которого гео-скоуп стал параметром). ## Расписание (миграция 306) | source | окно UTC | region_code | pages_per_anchor | interval_days | |---|---|---|---|---| | `domclick_city_sweep_moskva` | 0-3 | 77 | 100 | 3 | | `domclick_city_sweep_moskovskaya_oblast` | 3-6 | 50 | 100 | 3 | - `pages_per_anchor=100` — как у ЕКБ-строки. ДомКлик citywide, anchor-loop у него отсутствует (`fetch_around` → `NotImplementedError`), «pages» здесь означает глубину пагинации на комнатный бакет. Москва отдаёт ≈23 690 лотов вторички — глубину надо брать полную, а не свипную. - Окна 0-3 и 3-6: миграция 305 заняла 16-23, ЕКБ-домклик сидит в 3-6. Прогоны всё равно сериализуются планировщиком, окно лишь ограничивает старт. - `interval_days=3` — как у остальных строк 305: корпус живёт 14 суток (`LISTINGS_FRESH_DAYS`), трёхсуточный такт даёт четырёхкратный запас на пропуски из-за QRATOR-банов. - Включены сразу по той же причине, что и 305: регионы уходят тестировщикам, корпус истекает 26-27.09. - `ON CONFLICT (source) DO NOTHING` — повторный прогон no-op, не сбрасывает `enabled`, если строку потом выключили вручную. ## Известный риск (не блокер этого PR) Пул прокси истощён: живых 4 из 8 (id 1 — yandex-affinity, 13 и 14 — any, 15 — avito-affinity); id 9-12 выключены с 313-351 подряд неудачами. У ДомКлика affinity нет, он возьмёт «any», то есть будет конкурировать с cian за два узла. Первые прогоны 305 это уже показали: оба cian-прогона умерли за 0.1 с с `no proxy available for provider='cian'`. Расширение пула — отдельная задача; строки здесь корректны и начнут собирать, как только узлы появятся. ## Тесты `tests/test_scraper_kit_scheduler_parity.py tests/test_3264_domclick_sweep_cookies.py tests/test_migration_numbering.py` → **51 passed, 2 skipped**. `ruff check` / `ruff format` чисто. Номер миграции сверен с `forgejo/main` через `git ls-tree -r` (последняя — 305). 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01NQb6WeJtagZwZnUsSjDizs
lekss361 added 1 commit 2026-09-16 20:20:43 +00:00
feat(trade-in): регулярный сбор ДомКлика по Москве и области
All checks were successful
CI Trade-In / changes (pull_request) Successful in 10s
CI / changes (pull_request) Successful in 13s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
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
CI Trade-In / backend-tests (pull_request) Successful in 4m52s
07047750be
Миграция 305 завела регулярный сбор 77/50 для avito/cian/yandex и прямо
отложила ДомКлик: "у него нет wildcard-хендлера, а единственная возможная
строка source='domclick_city_sweep' занята Екатеринбургом". Это вторая
половина: код плюс строки расписания.

ДомКлик даёт около 23% корпуса обоих регионов — без него свежий срез 77/50
теряет почти четверть массы, а вместе с ней часть домов, по которым вообще
существуют аналоги.

Wildcard заведён на ОБЕИХ сторонах, и это не дубль. Продуктовый
_job_domclick_city_sweep перекрывает kit-native ради инъекции куки сессии
Sber ID (#3264); kit-native тело ходит на BFF без кук. Поставь wildcard
только в _default_kit_handlers — перекрытие осталось бы у ЕКБ и молча
пропало бы у регионов, а московская строка упёрлась бы в QRATOR ровно так,
как было до #3264. Новый тест
test_domclick_region_wildcard_resolves_to_product_handler пинит именно это:
все три source'а обязаны резолвиться на продуктовый job.

Гео-скоуп задаёт ТОЛЬКО region_code — профиль региона
(DOMCLICK_GEO_PROFILES) несёт address GUID, страницу прогрева QRATOR, bbox
гарда и имя города; профили 77 и 50 заведены и проверены живыми запросами
12-15.09.2026 (#3533). city_id в default_params намеренно не задан: он
vestigial, город штампуется из профиля. Неизвестный region_code роняет
прогон до первого запроса, тихого отката на ЕКБ нет.

Claude-Session: https://claude.ai/code/session_01NQb6WeJtagZwZnUsSjDizs
lekss361 merged commit 1452e63eec into main 2026-09-17 04:46:38 +00:00
lekss361 deleted branch feat/domclick-msk-sweeps 2026-09-17 04:46:39 +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#3545
No description provided.