fix(tradein/scraper): собирать вторичку Циана по области, а не только новостройки #2623
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2623
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/tradein-cian-oblast-secondary"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
default_params.newbuilding_only: falseчерез jsonb-мердж.run_cian_full_load(единственный владелец вторички по докстрингу) хардкодитcity=Екатеринбурги область не покрывает.cian_city_sweep, без суффикса города) НЕ тронуто — для него дефолт корректен, вторичку ЕКБ авторитетно собираетcian_full_load.⚠️ Верхняя Пышма ИСКЛЮЧЕНА из этой миграции (было 5, стало 4)
После первого варианта PR обнаружился риск: geo-проверка (
ST_DWithinот центра ЕКБ) показала, что городская меткаcityу cian-строк сcity="Верхняя Пышма"загрязнена екатеринбургскими объявлениями:Верхняя Пышма физически ~15 км от Екатеринбурга — anchor-развёртка захватывает краевые екатеринбургские объявления и подписывает их не тем городом.
listings.city— money-critical (её читаетasking_to_sold_ratio.pyдля city-скоупа ASKING vs SOLD стороны, #2583 H2) — неверная метка двигает выкупные цены. Включение вторички умножило бы это 23%-загрязнение (22 строки → несколько сотен).nizhniy_tagil/kamensk_uralskiy/pervouralsk/serov — загрязнение по той же проверке нулевое — включать безопасно.
Верхняя Пышма НЕ забыта — включат отдельной миграцией после починки городской разметки sweep'а (правится параллельно). Объяснение с цифрой 5/22 зафиксировано в шапке
204_cian_oblast_sweeps_secondary.sqlи в regression-guard тесте, чтобы не решили «забыли».Почему это безопасно (нагрузка / дубли / сегмент)
fetch_around_multi_room(providers/cian/serp.py) не принимает newbuilding_only/secondary_only — SERP-фаза (все room×page запросы) идёт одинаково независимо от флага. Фильтр в pipeline.py:2436 применяется ПОСЛЕ фетча, ДО save — чисто in-memory отсечение уже оплаченных запросов. Растёт только объём save_listings (DB writes): ~2-9 сохранённых лотов/прогон → ~55-184 (весь fetched-пул, по 4 оставшимся источникам). detail_top_n=10 detail-запросов тоже не растёт (LIMIT константен).cian_full_loadне будет. full_load всегдаcity_region_id=4743(ЕКБ), областные sweeps используют CITY_LOCATIONS[].cian_region_id (4886/4781/4925/4982, все != 4743) — физически разные региональные SERP-выдачи. dedup_hash = sha256(source|source_id) — глобальный Cian offer_id, ON CONFLICT DO UPDATE даже в edge-case не создаёт дубль-строку.listing_segment="vtorichka"(НЕ NULL), проходит фильтрlisting_segment IS NULL OR = vtorichkaв asking_to_sold_ratio.py/buildings_query.py — новые лоты попадут в оценку без доп. кода.Замеры (before/after, BEGIN...ROLLBACK на проде)
Прод-счётчики (scrape_runs.counters) до фикса:
verkhnyaya_pyshma38169— исключено из этого PR, см. секцию вышеjsonb-мердж перепроверен для финального (4-источникового) списка в транзакции с ROLLBACK на проде:
UPDATE 4строки, все соседние ключи (city/radius_m/detail_top_n/enrich_houses/pages_per_anchor/request_delay_sec) сохранены,cian_city_sweep(ЕКБ) иcian_city_sweep_verkhnyaya_pyshmaне задеты.Migration number
Main на момент ветки — до 202. Открытый PR #2622 (fix/tradein-geocoder-house-letter) уже занял 203 (
203_purge_geocode_cache_house_letter.sql) — использован 204, чтобы избежать коллизии. Перепроверено дважды (включая перед финальным push — parallel windows активны): main всё ещё на 202, других претендентов на 204 среди открытых PR нет.Test plan
tests/test_migration_204_cian_oblast_sweeps_secondary.py(9 тестов) — транзакционность, no-DDL, jsonb-мердж (не перезапись), ровно 4 таргет-source, ДВА regression-guard'а (barecian_city_sweepЕКБ Иcian_city_sweep_verkhnyaya_pyshmaотсутствуют в WHERE), no psycopg CAST trap, идемпотентностьpytestвtradein-mvp/backend: 3090 passed, 9 skipped, 1 pre-existing fail (test_search_api.py::test_search_cache_hit, 401 RBAC — не в скоупе, известен заранее)Границы
Только миграция + тест. Код скраперов/scheduler.py/pipeline.py не тронут — дефолт
newbuilding_only=Trueв коде остаётся как правильный fallback. Развёртки вручную не запускались.