feat(macro): Росстат open-data scraper → macro_indicator (#946, partial) #1143

Merged
bot-backend merged 1 commit from feat/rosstat-emiss-macro-946 into main 2026-06-07 13:12:02 +00:00
Collaborator

Что

EPIC2 макро-ingest #946: скрейпер Росстата (region 65 / ЕКБ по ОКТМО) в существующую macro_indicator (м.123). Частичный — приземляет демографию (population_total, §7.11); зеркалит форму cbr_macro.

Важное про reachability (проверено на проде)

  • ЕМИСС/fedstat.ru блокирует dev-IP WAF'ом (hard-403), поэтому ИПЦ/доходы/СМР-цены не строились из dev. Но из прод-IP ЕМИСС доступен (200 + SDMX) — буду добивать отдельным PR (EMISS-индикаторы).
  • rosstat.gov.ru/opendata из прода даёт SSL-cert-ошибку (Russian Trusted CA) при дефолтной проверке → но скрейпер использует verify=False (precedent: 8 скрейперов в репо), и с ним из прода list.csv=200 (491КБ), meta.csv=200 — т.е. на проде таска работает. (Сырой curl без -k давал 000 — это артефакт cert-проверки, не недоступность.)

Содержимое

  • services/scrapers/rosstat_emiss.py — pure-парсеры + тонкий httpx (registry→meta→data CSV, CP1251/UTF-8, comma-decimal, OKTMO-таргетинг).
  • workers/tasks/rosstat_macro_sync.py — Celery upsert (SAVEPOINT-per-row, CAST not ::, ON CONFLICT по PK indicator_type/region/obs_date, source=rosstat).
  • beat rosstat-macro-sync-monthly; include в celery_app; site_finder/macro.pypopulation_total → region-aware (additive, regression-тест не тронут).
  • 18 offline-тестов парсера+контракта.

Качество

  • code-reviewer: APPROVE — SQL-upsert gate пройден (SAVEPOINT/CAST/PK-match), verify=False на публичных GET без секретов (follow-up: bundled Russian CA fleet-wide), macro.py no-regression, парсер-тесты на реальных значениях, scope-honesty (EMISS-gaps документированы). 181 тест зелёный, ruff чисто, без новых deps/миграций.

Follow-up

  • PR 2 (скоро): EMISS-индикаторы (ИПЦ/доходы/СМР) через POST fedstat.ru/indicator/data.do?format=sdmx — работает из прода; парсер dev-тестируется на прод-фикстурах.
  • Fleet-wide: bundled Russian Trusted CA → verify=True.

Refs #946 (частично; EMISS-часть остаётся).

## Что EPIC2 макро-ingest #946: скрейпер Росстата (region 65 / ЕКБ по ОКТМО) в существующую `macro_indicator` (м.123). **Частичный** — приземляет демографию (`population_total`, §7.11); зеркалит форму `cbr_macro`. ## Важное про reachability (проверено на проде) - ЕМИСС/fedstat.ru блокирует **dev-IP** WAF'ом (hard-403), поэтому ИПЦ/доходы/СМР-цены не строились из dev. **Но из прод-IP ЕМИСС доступен** (200 + SDMX) — буду добивать отдельным PR (EMISS-индикаторы). - `rosstat.gov.ru/opendata` из прода даёт SSL-cert-ошибку (Russian Trusted CA) при дефолтной проверке → но скрейпер использует `verify=False` (precedent: 8 скрейперов в репо), и с ним из прода **list.csv=200 (491КБ), meta.csv=200** — т.е. на проде таска работает. (Сырой curl без -k давал 000 — это артефакт cert-проверки, не недоступность.) ## Содержимое - `services/scrapers/rosstat_emiss.py` — pure-парсеры + тонкий httpx (registry→meta→data CSV, CP1251/UTF-8, comma-decimal, OKTMO-таргетинг). - `workers/tasks/rosstat_macro_sync.py` — Celery upsert (SAVEPOINT-per-row, `CAST` not `::`, ON CONFLICT по PK indicator_type/region/obs_date, source=rosstat). - beat `rosstat-macro-sync-monthly`; include в celery_app; `site_finder/macro.py` — `population_total` → region-aware (additive, regression-тест не тронут). - 18 offline-тестов парсера+контракта. ## Качество - `code-reviewer`: ✅ APPROVE — SQL-upsert gate пройден (SAVEPOINT/CAST/PK-match), `verify=False` на публичных GET без секретов (follow-up: bundled Russian CA fleet-wide), macro.py no-regression, парсер-тесты на реальных значениях, scope-honesty (EMISS-gaps документированы). 181 тест зелёный, ruff чисто, без новых deps/миграций. ## Follow-up - **PR 2 (скоро):** EMISS-индикаторы (ИПЦ/доходы/СМР) через `POST fedstat.ru/indicator/data.do?format=sdmx` — работает из прода; парсер dev-тестируется на прод-фикстурах. - Fleet-wide: bundled Russian Trusted CA → `verify=True`. Refs #946 (частично; EMISS-часть остаётся).
bot-backend added the
data
scope/backend
GG-форсайт
site-finder
labels 2026-06-07 13:11:59 +00:00
bot-backend added 1 commit 2026-06-07 13:12:00 +00:00
feat(macro): Росстат open-data macro scraper -> macro_indicator (#946)
All checks were successful
CI / changes (push) Successful in 6s
CI / frontend-tests (push) Has been skipped
CI / changes (pull_request) Successful in 6s
CI / frontend-tests (pull_request) Has been skipped
CI / backend-tests (push) Successful in 6m18s
CI / backend-tests (pull_request) Successful in 6m33s
2da8a285b3
EPIC2 macro-ingest: региональный (Свердловская обл. ОКТМО 65 / ЕКБ) скрейпер
Росстата в унифицированную macro_indicator (м.123). Зеркалит форму cbr_macro:
pure-парсеры + тонкий httpx, Celery-таска с SAVEPOINT-per-row upsert
(CAST not ::, ON CONFLICT по PK indicator_type/region/obs_date).

ЕМИСС/fedstat.ru (SDMX) за WAF (hard-403 на всех путях из dev-IP) -> ИПЦ/доходы/
СМР-цены пока недоступны (документировано в коде). rosstat.gov.ru/opendata
(стандарт 4.0) WAF-free -> приземляет демографию population_total
(sverdl 4.32M / ekb 1.41M, §7.11).

- services/scrapers/rosstat_emiss.py — fetch+parse open-data (registry->meta->data CSV)
- workers/tasks/rosstat_macro_sync.py — Celery upsert (source=rosstat)
- beat: rosstat-macro-sync-monthly; include в celery_app
- site_finder/macro.py: population_total -> region-aware default sverdl (additive)
- tests: 18 offline-тестов парсера + контракта таски

Без миграции (вписано в существующую схему), без новых зависимостей.

Refs #946.
bot-backend merged commit f7c4d7a8c5 into main 2026-06-07 13:12:02 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1143
No description provided.