Черновик регулярного сбора по Москве и области: сетка якорей, ID площадок, гео-профили ДомКлика #3533
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#3533
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/msk-sweep-draft"
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?
Пункт 1 долга — черновик скрапперов (запрошен именно как черновик). Регулярного сбора по 77/50 нет, корпус живёт разовой загрузкой; ниже — то, без чего свип по Москве физически невозможен.
1. ДомКлик: гео-профиль вместо зашитого ЕКБ
_EKB_ADDRESS_GUID/_EKB_AREA_IDбыли модульными константами — прогон сregion_code != 66собрал бы Екатеринбург и проштамповал его чужим регионом.Новый
DomClickGeoProfile(region_code, address_guid, aids, origin_url, bbox, region_name, city_name)+ реестрDOMCLICK_GEO_PROFILES+geo_profile_for_region()(ValueError на неизвестном регионе)._build_offers_url/_build_count_urlберутaddress_guidиaidskeyword-only;aids=None→ параметр не добавляется.GUID Москвы
1d1463ae-…и области9930cc20-…проверены живым запросом 12.09.2026.aidsвне ЕКБ не нужен — счётчик без него совпадает с сайтом._is_geo_okтеперь по bbox профиля, имя региона сверяется только когда оно задано: вне ЕКБofferRegionNameнепригоден (Новая Москва приходит как «г. Говорово»).Страница прогрева 77/50 перепроверена живьём 15.09.2026 — черновик угадал неверно, исправлено вторым коммитом:
У Москвы своего субдомена нет, апекс и есть московская выдача; прогрев по 301 потерял бы куку QRATOR, а подзапрос к BFF без неё отдаёт ChallengeTimeout. Профиль 66 — байт в байт прежний.
2. Авито / Циан / Яндекс: снятие привязки к ЕКБ
CityLocation.cian_host(по умолчаниюhttps://ekb.cian.ru, для Москвыhttps://www.cian.ru) →CianScraper(city_host=…). Раньше домен был зашит вproviders/cian/serp.py:128.moskva(cianregion=1/ rgid587795),moskovskaya_oblast(4593/587654),moskva_i_mo(-1/741964). У всехavito_slug="moskva_i_mo"плюс новый флагavito_slug_is_region=True— у Авито Москва и область один скоуп, отдельного URL области нет.MULTI_CITY_SLUGS→resolve_city_nameвозвращает None →city=NULLвместо ложного города.get_city_anchors/get_city_locationмолча отдавали ЕКБ.Сетка якорей Москвы — 25 точек (5×5, шаг 0.10° по широте = 11.13 км, 0.15° по долготе = 9.39 км). Она привязана к
MOSCOW_ANCHOR_RADIUS_M = 8000: полудиагональ ячейки 7.27 км < 8 км, дыр нет. Расписания обязаны передаватьradius_m=8000— дефолтные 1500 оставят дыры. Центр (55.75/37.60) стоит первым, потому чтоget_city_anchor_pointберётanchors[0]; радиус гео-штампа Москвы — 30 км.Область: 12 спутниковых якорей из
_COVERAGE_NEGATIVE_CENTROIDS_DEG. В коде оставлен TODO на Домодедово, Раменское, Щёлково, Сергиев Посад, Ногинск, Электросталь, Серпухов, Коломну, Орехово-Зуево, Наро-Фоминск — координат этих городов нет ни в одном источнике репозитория, и выдумывать их агент не стал.3. Ценовые коридоры: планировщик + учёт усечения
Разведка исходила из того, что бисекцию надо портировать из
scripts/local-avito-msk/collect.py. Это оказалось неверно:pricing/bisection.py::walk_price_rangeсуществует, асинхронный, им пользуются все четыре провайдера. Не хватало другого — чистого тестируемого планировщика и учёта усечения.Новый
pricing/planner.py::plan_price_corridors(...) -> PricePlanсо статистикойPlanStats(corridors, truncated_corridors, missed_estimate, unknown_corridors, probes, max_depth_reached, root_count)и флагомcomplete. В живом движке —BisectionStats, параметрstatsопциональный (по умолчанию None, новых ветвлений в обходе нет).Попутно найден и закрыт дефект оригинала из
collect.py:geometric_midприhi - lo <= 1возвращал саму границу (max(low+1, …)перебивалmin(hi-1, …)) → рекурсия на себя, спасал только MAX_DEPTH. Добавлен третий предохранитель: атомарный коридор помечается, а не делится.price_bisection_enabled(region_code): False для 66 и None, True для прочих.Ограничение, которое надо снять отдельным заходом: ни один провайдер пока не передаёт ни планировщик, ни
stats=— это рабочие сиды, но сейчас мёртвый код, и усечение в счётчики прогона реально не попадёт. Нужны 4 call-site.Тесты
53 (ДомКлик) + 91 (реестр площадок) + 37 (планировщик) зелёные.
Чего в этом PR НЕТ
Самих расписаний
scrape_schedulesдля 77/50 — они пойдут отдельно, после того как первый ручной прогон подтвердит, что профили живые.🤖 Generated with Claude Code
https://claude.ai/code/session_01NQb6WeJtagZwZnUsSjDizs