feat(tradein): yandex city-sweep — один прогон SERP+address-enrich #867
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
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#867
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/tradein-yandex-full-sweep"
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?
«Другие поставщики так же» — yandex по образцу avito (#861) / cian (#864). Расширяет существующий
run_yandex_city_sweep(был SERP-only из #561).fetch_around_multi_room(rooms×price combos, #847) для полного покрытия.enrich_address: bool = True+ Phase 3 address-enrich: yandex SERP отдаёт адрес БЕЗ номера дома → fetch detail<title>(curl_cffi chrome120, прокси #860) → номер дома → UPDATE listings.address. Reuse_extract_address_from_title/_RE_HAS_HOUSE_NUMBERиз yandex_address_backfill (T10).YandexCitySweepCounters: +address_attempted/enriched/failed. cancel/heartbeat/consecutive-fail→banned/graceful как cian.POST /scrape/yandex-city-sweep+ runs + cancel (BackgroundTasks). scheduler.trigger пробрасывает enrich_address; schedule остаётся dormant (enabled не менялся).16 тестов (test_yandex_city_sweep.py). 1492 suite passed. ruff clean. (1 фейл search_cache_hit — pre-existing 401.)
Завершает набор full-sweep по всем поставщикам: avito#861, cian#864, yandex(этот). n1 — SERP-only, уже полный.
- YandexCitySweepCounters расширен: address_attempted/enriched/failed (pages_fetched удалён — fetch_around_multi_room агрегирует внутри) - run_yandex_city_sweep: переключён на fetch_around_multi_room (rooms×price-range combos, #847/#860), добавлен параметр enrich_address=True - Address-enrich фаза per anchor: для листингов без номера дома запрашивает detail <title>, извлекает полный адрес через yandex_address_backfill (_extract_address_from_title / _RE_HAS_HOUSE_NUMBER) - admin.py: POST /scrape/yandex-city-sweep + GET .../runs + /{run_id}/cancel (модель YandexCitySweepStartRequest: pages_per_anchor/request_delay_sec/ enrich_address/radius_m) - scheduler.py: trigger_yandex_city_sweep_run передаёт enrich_address из params - Тесты переписаны под новую сигнатуру: 16 тестов, все проходят✅ APPROVE — yandex city-sweep (SERP+address-enrich), завершает full-sweep набор (avito#861 / cian#864 / yandex).
Cruxes verified:
fetch_around_multi_roomсуществует (yandex_realty.py:326) — SERP-фаза, combos rooms×price._RE_HAS_HOUSE_NUMBER(yandex_address_backfill.py:43) +_extract_address_from_title(:55) — runtime-импорт в address-enrich резолвится.geocode_tried_atколонка существует (005_geocode_tracking.sql:13);SET geocode_tried_at = NULLпри улучшении адреса → корректный re-geocode trigger.CAST(:ids AS text[])+ANY(...),CAST(:id AS bigint), regexNOT (address ~ ',\s*\d+')— нет:x::type.commit+rollbackизоляция; consecutive-fail→mark_banned+abort + per-anchor heartbeat сохранены; HTTP-error в enrich →address_failed++, sweep продолжается.Anti-regression: старый #561 sweep был DORMANT (в prod не запускался —
#623egress-IP);enrich_addressdefault=True (backward-compat scheduler trigger); schedule остаётся dormant. Self-extending нет, секретов нет.🟡 cosmetic (не блок): docstring
run_yandex_city_sweepобещает reuse_eligible_listings_for_ids → _fetch_and_update_one, но код инлайнит SQL+HTTP-цикл и импортит только два regex/extract-хелпера. Doc-only mismatch.Мержу. (PR без
Refs #N/ linked issue — нет issue для перевода в qa.)