GET. Заголовок Access-Control-Allow-Origin: *
стоит, поэтому можно дёргать прямо из браузерных приложений. Данные обновляются примерно
раз в 15 минут, время снимка — в поле generated_at.
Python-urllib — отдаёт 403.
Это тот клиент, которым pandas ходит за URL внутри себя,
поэтому pd.read_csv("https://…") напрямую не сработает: качайте
файл через requests (примеры ниже уже так и написаны).
curl, wget,
requests и браузер работают без всяких заголовков.
Сначала берём meta.json — там список регионов с их
числовыми id. Эти id подставляются в адреса вида
r<id>.json. Важно: id региона может смениться, когда
добавляются новые собранные регионы (они отсортированы по алфавиту), поэтому сопоставляйте регион
по имени, а не запоминайте номер.
| Адрес | Что внутри |
|---|
Сколько участков страны уже собрано, разрез по регионам, плюс действующие параметры правила «спорности». Маленький файл — удобно опрашивать.
Не путайте три счётчика. В разрезе по регионам
collected — участки, у которых есть оба протокола,
а federal и mandate — у которых есть
соответствующий. Верхняя строка сайта и meta.json считают участки
с хотя бы одним протоколом, поэтому там число чуть больше, чем
collected_uiks: два протокола запрашиваются отдельно и приходят
не всегда одновременно.
Содержит все участки региона, а не только собранные. Формат компактный:
cols — названия колонок, rows — массивы значений.
| Колонка | Смысл |
|---|---|
guid | идентификатор участка в системе ЦИК (стабильный) |
name, num | «УИК №123» и его номер |
tik | территориальная комиссия (район) |
collected | true, если собраны оба протокола |
federal | есть федеральный протокол (партсписки) |
mandate | есть одномандатный протокол |
suspicious | участок помечен как спорный (см. ниже) |
По каждому собранному участку: votes — голоса в том же порядке,
что массив parties; protocol — строки протокола
в порядке protocolLines (1 — в списке, 9 — недействительные, 10 — действительные).
Разделитель ;, кодировка UTF-8 с BOM — Excel открывает без плясок.
Колонки: region;tik;uik;uik_num;guid;registered;turnout;invalid;valid;suspicious,
далее по одной колонке на каждую партию (заголовок — полное название партии).
У каждого участка свой список candidates (ФИО, партия выдвижения,
голоса) и номер округа district. Кандидаты различаются от округа к округу,
поэтому единой «широкой» таблицы тут быть не может — в отличие от федеральных.
Важно: у одномандатного протокола своё число избирателей в списке. Оно может быть меньше федерального: «мобильным избирателям» из других округов окружной бюллетень не выдают. Не смешивайте явку из одного протокола с числом избирателей из другого.
В seats.json лежит variants с тремя наборами:
orig (как в данных ЦИК), clean (без спорных участков),
fixed (спорные заменены средними по региону). В каждом — federal[225],
mandate[225] и подробности по округам с победителями.
Одна строка — один участок: число избирателей, явка и голоса, свёрнутые по партиям,
отдельно для федерального и одномандатного, плюс метка спорности. Колонки перечислены в поле cols.
Монолитного дампа на 90 тысяч участков намеренно нет: он менялся бы целиком каждые 15 минут и его пришлось бы перекачивать. Вместо этого данные нарезаны по регионам — забираются циклом и хорошо кэшируются.
Метка suspicious проставлена у каждого участка во всех выгрузках —
можно использовать её по-своему или пересчитать самостоятельно по сырым данным.
Это эвристика, а не доказательство нарушений: она намеренно консервативна
(нужны оба признака сразу, малые участки исключены), поэтому скорее пропустит сомнительный
участок, чем пометит честный.
Актуальные числовые параметры всегда лежат в status.json
в поле suspicious_rule — эта страница показывает именно их, так что при
изменении правила описание обновится автоматически.
Источник — публичные протоколы участковых комиссий с сайта ЦИК РФ
(сводные таблицы результатов). Здесь они только перекладываются в удобный формат: значения
протоколов не изменяются и не пересчитываются. Исключение — варианты
clean/fixed в seats.json,
которые явно помечены как расчётные.