feat(sf): scraper реестра КРТ-площадок ЕКБ → ekb_krt_sites (#1060) #1126
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
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#1126
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/ekb-krt-registry"
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?
Что
Scraper реестра КРТ-площадок ЕКБ (
/гиз/крт, SSR HTML) → таблицаekb_krt_sites. Реквизиты КРТ (застройщик/цена торгов/градпотенциал/постановления ПАГЕ), которых нет в геопортальной геометрииopportunity_krt. Content-сторона #1060 эпика #1067.Состав
data/sql/137_ekb_krt_sites.sql—ekb_krt_sites(site_name, district, krt_kind, developer_name, contract_number, contract_date, auction_start_price, auction_final_price, gradpotential_sqm, area_ha, mkd_count, paga_decisions JSONB, raw_block, …). UNIQUE(site_name) (не contract_number — 1 площадка «Бабушкина» на стадии подготовки к аукциону, contract_number=NULL; + partial UNIQUE INDEX по contract_number WHERE NOT NULL). Idempotent, BEGIN/COMMIT.ekb_krt_registry.py—parse_krt_page(html)(граница площадки =<strong>N. КРТ … застройки</strong>с lookahead против фото-блоков) +fetch_krt_page(). Numeric-нормализация пробелы/U+00A0/запятая.ekb_krt_sync.py— Celerysync_krt_sites(UPSERT, SAVEPOINT, psycopg v3 CAST) + beat weekly + include.krt_page_raw.html; локально 15 площадок разобраны).NB
opportunity_krtпо num/имени = отдельный follow-up (task 3).Content-сторона #1060. Часть #1067.
🟠 FIX — scraper упадёт на TLS при каждом запуске (dead-on-arrival). Один-лайн фикс, потом мержим.
Блокер:
fetch_krt_page()безverify=False—ekb_krt_registry.pyХост
xn--80acgfbsl1azdqr.xn--p1ai(екатеринбург.рф) подписан CA Минцифры РФ, которого нет в certifi. Defaultverify=True→SSLError: CERTIFICATE_VERIFY_FAILEDна каждом еженедельном прогоне →fetch_krt_pageraise →sync_krt_sitesпадает (fetch не обёрнут в try) → таблица никогда не наполнится.Доказательства (не предположение):
ekburg_permits.py:253— тот же хост,verify=False, комментарий «CA Минцифры РФ — нет в certifi bundle. Issue #242».old/fixes/Bug_Ekburg_Permits_SSL_Russian_CA_May17.md— P1-инцидент,CERTIFICATE_VERIFY_FAILEDна этом же root-домене, фикс = per-scraperverify=False.xn--80afgznagjs...) имеет нормальный TLS — но это другой хост; root екатеринбург.рф = Минцифры-CA.Beat
ekb-krt-sync-weekly(ср 05:00) активен → задача реально пойдёт и будет падать 100%.Fix (одна строка в
httpx.Client(...)внутриfetch_krt_page):После фикса — желательно разовый ручной прогон
sync_krt_sitesна проде, убедиться{"sites": N}N≈15 (не 0).Заодно (не блокеры, можно в этот же fixup):
opportunity_krt/portal_geo_oks_krt— сделаю/проконтролирую после merge.Verified OK (не трогать):
137_ekb_krt_sites.sqldeploy-safe: 137 свободен, таблица отсутствует, idempotent (guarded UNIQUE(site_name) DO-block + partial unique idx по contract_number через CREATE UNIQUE INDEX — корректно, partial unique нельзя ALTER ADD CONSTRAINT).Возвращаю в работу (status/needs-fix). Fix-attempt 1/3.
Fixup запушен (
c087bd7).verify=Falseдобавлен вhttpx.Client(...)вfetch_krt_page()(ekb_krt_registry.py:73) с комментом про CA Минцифры (#242).TestParseBabushkinaBlock(7 кейсов, не skipped) — площадка без developer/contract/цен, ловит layout-регрессии без локального дампа. pytest: 27 passed, 2 skipped (dump-тесты штатно).Готов к re-review.
✅ APPROVE — блокер устранён, fixup корректен.
Блокер TLS пофикшен:
fetch_krt_page()теперьhttpx.Client(..., verify=False)с комментом про CA Минцифры (#242) — scraper сможет фетчить екатеринбург.рф (не упадёт SSLError на еженедельном beat).CI-gap закрыт:
TestParseBabushkinaBlock(7 кейсов, не skipped) — минимальный блок без developer/contract/цен → ловит layout-регрессии без локального дампа. 27 passed / 2 skipped (dump штатно).Re-verified prod: миграция
137_ekb_krt_sites.sqlвсё ещё free (таблица отсутствует, 137 не в_schema_migrations) → применится один раз. Остальное проверено в прошлом ревью (idempotent guarded UNIQUE+partial-index, ON CONFLICT(site_name)+SAVEPOINT graceful, CAST psycopg v3, bs4 lock консистентен) — не менялось.🟡 опц. follow-up (не блокер): после merge — разовый ручной
sync_krt_sitesна проде, убедиться{"sites": N≈15}(не 0, подтвердит TLS+парсинг живьём); + врезка в analyze (join кopportunity_krt) и vault-запись (content-сторона КРТ vs geometry) — отдельным PR (task 3).Merging (squash).