Python: данные через API budget.gov.ru
Назначение и аудитория
Для разработчиков на Python, которым нужен минимальный рабочий скрипт вокруг list.json единого портала бюджетной системы: найти набор, собрать URL meta.json, подготовить дальнейшее скачивание CSV или вызовы REST по паспорту. Полная инструкция с живым запросом — в Работа с API budget.gov.ru.
Входные данные
- Каталог наборов — https://budget.gov.ru/epbs/opendata/list.json (см. наборы ГИИС).
identifierнабора — например7710568760-REGISTAGREEMENT(реестр соглашений).User-Agentи таймаут 120 с дляlist.json— файл большой; при HTML вместо JSON см. раздел ограничений в how-to по API.
Инструменты
- Python 3.10+ с пакетом
requests(илиhttpx) иjson. urllib.parse.urljoin— для нормализации поляlinkс префиксомnull/.
Шаги
- Выполните
GET list.jsonс осмысленнымUser-Agentи достаточным таймаутом. - Найдите в массиве
metaобъект с нужнымidentifier. - Соберите абсолютный URL паспорта из поля
link(отбросьте префиксnull/при относительной ссылке). - Загрузите
meta.jsonпаспорта и продолжите по полямdata,structureили по документации REST на витрине портала. - Зафиксируйте
modifiedиз паспорта в метаданных вашего снимка.
Воспроизводимый пример
Ниже — логика сборки URL на встроенном фрагменте каталога (без сети). Замените строку CATALOG_JSON на результат живого GET к list.json, когда сеть доступна.
import json
from urllib.parse import urljoin
CATALOG_JSON = r"""
{
"meta": [
{
"identifier": "7710568760-REGISTAGREEMENT",
"title": "Реестр соглашений (пример)",
"link": "null/7710568760-REGISTAGREEMENT/meta.json"
}
]
}
"""
OPENDATA_BASE = "https://budget.gov.ru/epbs/opendata/"
def link_to_meta_url(link: str) -> str:
if link.startswith("http://") or link.startswith("https://"):
return link
if link.startswith("null/"):
link = link[len("null/") :]
return urljoin(OPENDATA_BASE, link)
catalog = json.loads(CATALOG_JSON)
row = next(x for x in catalog["meta"] if x["identifier"] == "7710568760-REGISTAGREEMENT")
meta_url = link_to_meta_url(row["link"])
print("Паспорт:", meta_url)
assert meta_url.startswith("https://budget.gov.ru/epbs/opendata/")
assert meta_url.endswith("meta.json")
Ожидаемый вывод содержит https://budget.gov.ru/epbs/opendata/7710568760-REGISTAGREEMENT/meta.json.
Проверка результата
meta_urlначинается сhttps://budget.gov.ru/epbs/opendata/и заканчивается наmeta.json.- На живом каталоге длина массива
metaсовпадает с ожидаемым порядка тысяч позиций; при подозрении на HTML проверьте первые байты ответа. identifierв загруженном паспорте совпадает с выбранной строкой каталога.
Ограничения и типовые ошибки
- Сеть и TLS — в корпоративных средах запрос к
budget.gov.ruможет зависать на рукопожатии (SSL handshake timeout) или обрываться прокси; проверьте цепочку сертификатов и доступ с той же машины из браузера. Полный сценарий с живымlist.json— в Работа с API budget.gov.ru. - Поле
linkсnull/— нормальная особенность каталога; не склеивайте URL строковой конкатенацией безurljoin. - Короткие URL на Liferay часто дают 404 — используйте только пути
/epbs/opendata/...из официальной инструкции. - REST-эндпоинты меняются — не копируйте старые пути без проверки витрины API.
Связанные страницы
- Работа с API budget.gov.ru — полный сценарий с живым
list.json. - Наборы данных ГИИС «Электронный бюджет».
- ГИИС «Электронный бюджет».