Импорт сырья msk_raw умеет Московскую область, а не только Москву #3505

Merged
lekss361 merged 1 commit from feat/msk-raw-import-region-50 into main 2026-09-12 14:49:08 +00:00
Owner

Целевой регион стал параметром: --region, по умолчанию 77. Поведение Москвы остаётся байт-в-байт, есть анти-регресс-тест на прежних фикстурах.

Как каждый источник узнаёт область

Все числа — замер по прод-сырью 12.09.2026.

Циан. Область в адресе не видна вовсе, поэтому читается по поддомену source_url. Поддомен www даёт 38 030 карточек, из них 36 569 с префиксом округа. Все прочие поддомены — ноль карточек с округом:

поддомен карточек из них с округом
www 38 030 36 569
krasnogorsk 2 065 0
balashikha 1 828 0
vidnoye 1 802 0
lyubertsy 1 498 0
khimki 1 306 0
… ещё ~60 поддоменов 0

Два сигнала нигде не противоречат друг другу, поэтому Москва остаётся на префиксе округа (не трогаем), а область берётся из URL. Хост не *.cian.ru, голый cian.ru, пустой или отсутствующий source_url — всё даёт None и трактуется как «не область». Ложной области такой промах не создаёт.

Яндекс. Второй компонент адреса, значений ровно два: «Москва» 13 287, «Московская область» 10 865.

Авито. Регион приходит из пред-геокода, адресного признака у источника нет ни для какого региона. Полка msk_raw.avito_geocode уже содержит 9 840 строк с region_code=50 (77 — 11 682, NULL — 2 757), а _resolve_points читает кэш первым, так что прогон по области не стоит ни одного вызова DaData.

ДомКлик. Областного корпуса нет вовсе: сырьё собрано с GUID-ом Москвы, первый компонент адреса имеет одно значение «Москва» на всех 22 836 карточках. Поэтому --source domclick --region 50 падает явным SystemExit до любого обращения к БД, а не отдаёт тихий ноль.

city для области

Пишется None. Единого города у области нет — canonical_city в реестре пуст. save_listings объявляет city: str | None и пишет city = COALESCE(EXCLUDED.city, listings.city), то есть повторный прогон уже известный город не затирает. Продуктовой потери нет: подбор аналогов радиусный (ST_DWithin), а ценовая полоса ДКП ключуется на deals.city, а не на listings.city.

Счётчики

skipped_not_moscowskipped_not_target_region, skipped_oblastskipped_geo_other_region. Формула check() обновлена, итоговый лог называет целевой регион вместо «Москвы».

Проверка

52 passed in 1.13s
ruff check: All checks passed!

Ревью пройдено, вердикт APPROVE. Единственное замечание — поддомен читался из netloc, и гипотетический порт в URL промахнулся бы мимо суффикса. Исправлено переходом на hostname плюс тест на порт, регистр хоста и похожий домен.

🤖 Generated with Claude Code

https://claude.ai/code/session_01NQb6WeJtagZwZnUsSjDizs

Целевой регион стал параметром: `--region`, по умолчанию 77. Поведение Москвы остаётся байт-в-байт, есть анти-регресс-тест на прежних фикстурах. ## Как каждый источник узнаёт область Все числа — замер по прод-сырью 12.09.2026. **Циан.** Область в адресе не видна вовсе, поэтому читается по поддомену `source_url`. Поддомен `www` даёт 38 030 карточек, из них 36 569 с префиксом округа. Все прочие поддомены — ноль карточек с округом: | поддомен | карточек | из них с округом | |---|---|---| | www | 38 030 | 36 569 | | krasnogorsk | 2 065 | 0 | | balashikha | 1 828 | 0 | | vidnoye | 1 802 | 0 | | lyubertsy | 1 498 | 0 | | khimki | 1 306 | 0 | | … ещё ~60 поддоменов | | 0 | Два сигнала нигде не противоречат друг другу, поэтому Москва остаётся на префиксе округа (не трогаем), а область берётся из URL. Хост не `*.cian.ru`, голый `cian.ru`, пустой или отсутствующий `source_url` — всё даёт `None` и трактуется как «не область». Ложной области такой промах не создаёт. **Яндекс.** Второй компонент адреса, значений ровно два: «Москва» 13 287, «Московская область» 10 865. **Авито.** Регион приходит из пред-геокода, адресного признака у источника нет ни для какого региона. Полка `msk_raw.avito_geocode` уже содержит 9 840 строк с `region_code=50` (77 — 11 682, NULL — 2 757), а `_resolve_points` читает кэш первым, так что прогон по области не стоит ни одного вызова DaData. **ДомКлик.** Областного корпуса нет вовсе: сырьё собрано с GUID-ом Москвы, первый компонент адреса имеет одно значение «Москва» на всех 22 836 карточках. Поэтому `--source domclick --region 50` падает явным `SystemExit` до любого обращения к БД, а не отдаёт тихий ноль. ## city для области Пишется `None`. Единого города у области нет — `canonical_city` в реестре пуст. `save_listings` объявляет `city: str | None` и пишет `city = COALESCE(EXCLUDED.city, listings.city)`, то есть повторный прогон уже известный город не затирает. Продуктовой потери нет: подбор аналогов радиусный (`ST_DWithin`), а ценовая полоса ДКП ключуется на `deals.city`, а не на `listings.city`. ## Счётчики `skipped_not_moscow` → `skipped_not_target_region`, `skipped_oblast` → `skipped_geo_other_region`. Формула `check()` обновлена, итоговый лог называет целевой регион вместо «Москвы». ## Проверка ``` 52 passed in 1.13s ruff check: All checks passed! ``` Ревью пройдено, вердикт APPROVE. Единственное замечание — поддомен читался из `netloc`, и гипотетический порт в URL промахнулся бы мимо суффикса. Исправлено переходом на `hostname` плюс тест на порт, регистр хоста и похожий домен. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01NQb6WeJtagZwZnUsSjDizs
lekss361 added 1 commit 2026-09-12 14:26:21 +00:00
Импорт сырья msk_raw умеет Московскую область, а не только Москву
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 11s
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 4m40s
050a133839
Целевой регион стал параметром (--region, 77 по умолчанию). Поведение Москвы
осталось байт-в-байт: её карточки Циана по-прежнему опознаются префиксом округа,
Яндекса — вторым компонентом адреса, ДомКлика — первым.

Область у Циана в адресе не видна вовсе, поэтому берётся по поддомену source_url.
Замер по прод-сырью 12.09.2026: поддомен www даёт 38 030 карточек, из них 36 569 с
префиксом округа; все прочие поддомены (krasnogorsk, balashikha, vidnoye, lyubertsy,
khimki, mytishchi, podolsk, odintsovo и ещё полсотни) — ноль карточек с округом.
Два сигнала нигде не противоречат друг другу, поэтому Москва остаётся на округе, а
область читается из URL. Нераспознанный хост даёт None и трактуется как «не область»
— ложной области он не создаёт.

У Яндекса область — второй компонент адреса, значений ровно два: Москва 13 287 и
Московская область 10 865. У Авито регион приходит из пред-геокода, и полка
msk_raw.avito_geocode уже содержит 9 840 строк с регионом 50, так что прогон по
области не стоит ни одного внешнего вызова. У ДомКлика областного корпуса нет вовсе
— сырьё собрано с GUID-ом Москвы, поэтому --region 50 падает явной ошибкой, а не
отдаёт тихий ноль.

В listings.city для области пишется None: единого города у неё нет (canonical_city в
реестре пуст), а save_listings COALESCE'ит city и уже известное значение не затирает.
Подбор аналогов радиусный, ценовая полоса ДКП ключуется на deals.city, так что потери
нет.

Счётчики переименованы под параметр: skipped_not_moscow стал skipped_not_target_region,
skipped_oblast — skipped_geo_other_region.
lekss361 merged commit a8ba2d5d3c into main 2026-09-12 14:49:08 +00:00
lekss361 deleted branch feat/msk-raw-import-region-50 2026-09-12 14:49:08 +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#3505
No description provided.