feat(tradein): вся Свердловская область — 40 городов в city-sweep #2879
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#2879
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/tradein-oblast-full"
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?
Зачем
Покрытие было 6 городов. По области — 3 229 объявлений против 20 111 по Екатеринбургу, причём 83% всех свежих данных приходится на ЕКБ. Заводим оставшиеся 40 городов области.
Данные добыты, а не выведены по правилу
Слаги площадок не выводятся транслитерацией — у Авито
kamensk-uralskiyчерез дефис,verhnyaya_pyshmaбез «к». Поэтому каждый идентификатор добывался с площадки, и каждый метод сначала прогонялся на 5 городах с уже известными значениями. Собирали новые только после точного воспроизведения эталона.cian_idyandex_rgidavito_slugКонтрольная проверка на Авито важна отдельно — она доказывает, что метод различает верное и неверное, а не просто возвращает 200 на что угодно.
Сверка поймала три ошибки
Они бы молча уехали в прод:
Строки только там, где идентификатор подтверждён
Итого 102 строки вместо 123. Развёртка с неподтверждённым идентификатором молча собирала бы Екатеринбург под меткой другого города — мусор в данных, который потом не отличить. Это хуже отсутствия развёртки.
Защита от тихого отката
CityLocation:avito_slug/yandex_rgidсталиOptional;cian_region_idостался обязательным как единственный подтверждённый у всех.ValueErrorдо любого I/O, если город есть вCITY_LOCATIONSбез идентификатора. Без него_city_seg()откатывается на"ekaterinburg"— и сбор шёл бы по ЕКБ под меткой города-цели._dispatchуже логирует исключения job'а, так что отказ и явный, и залогированный.CITY_DISPLAY_NAMESна 40 городов — иначеlistings.cityзаписался бы как «Екатеринбург»._OBLAST_AVITO_URL_PATTERNSпадала на импорте модуля приavito_slug=None.Параметры
radius_m3000 для avito/cian (не 1500 — миграция 179 сама предупреждает, что одного якоря на 1500 м может не хватить), 25000 для yandex.detail_top_n=0у avito: детали сейчас отдают HTTP 439 firewall независимо от IP (#2827), 20 обречённых запросов на город только приблизили бы бан.interval_days=3.Все 102 строки выключены — включение волнами, вручную, с проверкой банов между волнами.
Test plan
ruff check/ruff format— чисто, pre-commit зелёныйCITY_LOCATIONS↔ строки миграции по каждому источнику отдельно: строка есть тогда и только тогда, когда есть идентификаторrevda→avito,mikhaylovsk→yandex), а не просто присутствует в кодеINSERT ... ON CONFLICT (source) DO NOTHINGlistings.cityпишется верно, а не «Екатеринбург»Хвост
16 городов с Авито стоит передобыть на отдохнувшем пуле — список в шапке миграции. Это отдельная миграция, не блокирует эту.