Осенью 2017 года ребята из ГОЛОСа подумали, что онлайн-трансляцию выборов надо выводить на новый уровень:

  • во-первых, расстраивало, что до сих пор на картах субъектов Российской федерации нет детализации до территориальных комиссий,
  • во-вторых, крайняя сложность и запутанность сайта ЦИК, которая не позволяет быстро узнать результаты по своему избирательному участку,
  • и в-третьих, решено было начать делать основу для энциклопедии результатов, когда можно посмотреть результаты по разным выборам для одного участка. Грубо говоря, узнать, как голосовали соседи.

И все это не только для того, чтобы узнать в каком регионе живет 39% избирателей за Грудинина, но и для того, чтобы проверить, есть ли такой участок в стране, где Путин не выиграл выборы.

Довольно быстро выяснилось, что финансовых вливаний в этот проект, увы, ждать не стоит и далее все работали практически на чистом энтузиазме.
Ассоциация некоммерческих организаций «В защиту прав избирателей „Голос“» — российская общественная организация. Основана в 2000 году. Декларируемая задача организации — защита прав избирателей. На середину 2013 года организация была активна в 40 регионах России.

В своей работе «Голос» информирует граждан об избирательном законодательстве России, проводит долгосрочное и краткосрочное наблюдение за выборами на всех этапах выборов.

Я присоединился к проекту, когда ребята уже четко представляли: откуда будут брать данные, структуру проекта и дизайн. В команду нужен был человек, чтобы заниматься серверной частью, эту позицию я и занял.

Проект структурно разбили на две принципиальные части.

Первая часть: до выборов


Первая часть: до выборов (uik.golosinfo.org), должна была стартовать за неделю до выборов, и предоставлять возможности:

  1. найти по адресу свой избирательный участок;
  2. посмотреть, где он находится на карте;
  3. вспомнить как именно голосовали люди на этом участке.


На этом этапе все начинается с поиска по базе адресов избирателей на более чем 17 млн. записей, которую можно спарсить с сайта ЦИК. В этой базе каждый компонент адреса вроде номера дома, улицы, города или района это отдельное поле и таких компонентов существует 16 видов. Набор непустых компонентов для различных адресов сильно отличается. Простой поиск даже одного адреса в этой базе занимал более минуты, что само по себе слишком долго, а если говорить о нагруженном проекте, то и не позволительно. Тут на помощь пришел Sphinx и время поиска сократилось до сотых долей секунды.
Sphinx (англ. SQL Phrase Index) — система полнотекстового поиска, разработанная Андреем Аксёновым и распространяемая по лицензии GNU GPL. Отличительной особенностью является высокая скорость индексации и поиска, а также интеграция с существующими СУБД (MySQL, PostgreSQL) и API для распространённых языков веб-программирования (официально поддерживаются PHP, Python, Java; существуют реализованные сообществом API для Perl, Ruby,.NET и C++).
Если вы еще не знакомы со Sphinx, то очень рекомендую, работа с ним похожа на магию, он легко настраивается и просто работает. Между прочим, ходят слухи, что и поиск Хабра использует этот поисковый движок.

Поиск по базе адресов позволяет определить к какой избирательной комиссии относится избиратель в 2018 году, но не в 2012 (время прошлых выборов). На первый взгляд кажется, что ничего особенно сильно не могло измениться и люди как ходили голосовать в ближайшую школу, так и будут ходить. Но на самом деле изменения были и их было много: в 2013 году поменялись номера участков более чем у половины УИК (участковых избирательных комиссий). Для того чтобы показать, как голосовал участок на прошлых выборах президента необходимо установить соответствие между номером участка в 2018 году и номером в 2012.

В этом сопоставлении возникла большая трудность.

К сожалению, адресной базы на 2012 год найти нигде не удалось (иначе можно было реализовать прямое соответствие адреса участку). Поэтому пришлось сопоставлять адреса УИК 12 года и 18-го. Адреса были в разном формате, поэтому был написан скрипт, выделяющий название населенного пункта и улицы (проспекта, переулка и т.д.). Таким образом удалось сматчить около 60 тысяч УИК. В тот же день мы запустились и столкнулись с недовольством пользователей, которые сообщали о том, что не могут найти свой УИК. Оперативно в тот же день благодаря помощи неравнодушных людей мы провели матчинг оставшихся УИКов по координатам с помощью библиотеки для Python geopy и в результате практически по каждому адресу получилась возможность выдавать явку и количество голосов за кандидатов по прошлым выборам.



По данным 16 года (Выборы в Госдуму) все было готово, но впилить в бэк и фронтенд уже не успели, это в планах.

Вторая часть: день выборов


В процессе обсуждения планов осенью у ребят из ГОЛОСа настолько разыгрались аппетиты, что решено было показывать результаты реал-тайм с детализацией до каждого участка! Однако на этой идее мы и погорели.

Итак, по плану в день выборов сайт должен был в режиме онлайн показывать явку избирателей с детализацией от страны до отдельных избирательных участков, а когда подсчет голосов будет окончен переключиться в режим показа каким образом голосовали россияне различных регионов.

Вторая часть проекта должна была стартовать с началом выборов и показывать на карте с некоторой задержкой динамику явки избирателей. Планировалось, что сначала на карте начнут загораться цветом дальневосточные регионы, а по мере открытия избирательных участков цветная граница будет продвигаться на запад.

Участковые комиссии в ходе голосования должны подавать данные о явке на 10, 12, 15 и 18 часов, дальше подсчет голосов и комиссии подают детальную статистику по своему избирательному участку. У нас был настроен парсер, который был готов аккуратно забирать данные с сайта ЦИК, как только они обновлялись, и загружать в базу на сервере, для того чтобы посетители сайта могли видеть, как развиваются события с минимальной задержкой.

Вся логика бекенда и фронтенда была построена на сборке данных вышележащих уровней из нижележащих (УИК). Однако это была наша заведомая ошибка, так как мы предполагали, что результаты будут являться сразу по всем УИК в регионе, в реальности это не так. В реальности оказалось, что не все данные появлялись на сайте ЦИК своевременно. По правде говоря, почти ни откуда не приходили полные данные. В результате происходило такое: данные могли прийти только от одного единственного УИК в регионе.

Кроме того, мы парсили страницы территориальных комиссий на которых размещается сводная таблица со статистикой по участковым комиссиям, а это долго, потому что таких страниц целых 2800. Например страниц со статистикой по ТИКам всего лишь 85, как количество субъектов РФ. Мы должны были написать отдельные парсеры на страну, субъекты РФ и ТИКам, и обновлять их своевременно, а УИКи по мере готовности, тогда это все сработало бы.

Из-за того что мы не предвидели сложности заранее в процессе голосования было принято решение не переходить ко второму этапу работы проекта пока не будет полных достоверных данных. Так проект потерял возможность наблюдать за явкой практически в режиме реального времени. Но возможность рассмотреть внимательно карту явки и изучить распределение голосов за кандидатов никуда не делась, когда у нас появились полные данные (к вечеру следующего дня) мы переключили наш проект в режим показа результатов выборов.


В результате все три глобальных мегагештальта были закрыты (карта, поиск своего УИК по адресу, просмотр результатов прошлых выборов), но онлайн так и не получился. Хотя все ошибки были скрупулезно изучены и теперь мы знаем как это сделать, все же ждем от ЦИКа большей коммуникабельности и того, что они наконец начнут отдавать свои данные реал-тайм через API.

А ещё:

  • я узнал, что каких только адресов и названий в России нет. Оказывается, есть много людей, которые всю время живут и прописаны в тупике.
  • получилась очень залипательная штука, можно бесконечно водить по карте и наблюдать за тем, как меняются циферки

Мы благодарим всех причастных к этому проекту, в частности команду лаборатории DataMap, которые сделали карту (огромный труд!): Андреева Вячеслава, Балашова Антона, Манджиева Хонгора, а также Елену Никитину, Глеба Суворова, Сергея Устинова, Валерия Вискалина, Марата Халиулина.

Комментарии (14)


  1. ton1
    09.04.2018 17:21

    Тот редкий случай, когда из-за кдпв чуть не плюнул в экран хабра


    1. NewStahl
      09.04.2018 20:42

      Что не так? 2018-е марта? А сколько в марте дней? :)


  1. novice2001
    09.04.2018 19:24
    +1

    1. Поправьте ссылку. У вас вместо uik.golosinfo.org написано uil.golosinfo.org.
    2. Поправьте текст.

    Кроме того, мы парсили страницы УИКов, а это долго, потому что их целых 2800. Например страниц ТИКов всего лишь 85
    .
    85 — это все-таки количество избирательных комиссий субъектов (ИКС РФ), а вот ТИКов, видимо, уже около 2800. УИКов по стране что-то около 90-100 тысяч.


    1. ZAITSAU Автор
      09.04.2018 20:42

      Спасибо за исправление)

      На счет второго пункта: есть 85 страниц регионов, на них можно получить цифры по всем ТИКам этого региона и есть 2800 страниц ТИКов — на которых цифры по всем УИКам этой территориальной комиссии. Я поправлю формулировку чтобы читалось)


  1. xmaster83
    09.04.2018 20:33

    Главное не как проголосуют, а как по считают. (с) И.Сталин


    1. velovich
      09.04.2018 23:21
      +1

      Думаю Сталин написал бы «посчитают» слитно.


      1. PaulMaly
        10.04.2018 08:22
        +1

        Ещё без «т» в конце.)))


  1. c0ntr0ller
    10.04.2018 08:06

    Безотносительно политических предпочтений хочу заметить, что результат прошлых «выборов» выглядит несколько странно — смущает Прохоров с более чем 1/3 голосов (про других «кандидатов» ничего не скажу). Может исходные данные кривые или их интерпретация неверна?


    1. ZAITSAU Автор
      10.04.2018 08:20

      Похоже что такие цифры прямо из ЦИКа идут.
      На сколько могу судить по данным ЦИКа Прохоров набрал более 27% в Пресненском районе Москвы, а вот в УИК 78 ещё интереснее – там у него на 3% больше, чем у Путина. Пруф.


    1. ZAITSAU Автор
      10.04.2018 08:36

      Как вам, кстати, 39% за Грудинина в некоторых ТИКах Якутии?


    1. lostpassword
      11.04.2018 00:22

      Так это ж результат не всех выборов, а одного конкретного участка.
      Напротив, было бы странно, если бы подобные девиации отсутствовали.


  1. Anton_Abrosimov
    10.04.2018 13:16

    Долго парсить 2800 страниц? Вы их руками, или на калькуляторе парсили?
    17 лярдов страниц с etprf.ru были скачаны и разобраны за 2 ночи. На «домашнем» компе, с «домашним» интернетом.
    Два дня ушло на анализ страниц (более 300 типов полей, связей) и написание кода (scarpy, peewee).

    Какая сложность возникла при разборе ТИКов?


    1. ZAITSAU Автор
      10.04.2018 13:21

      Говорят дело в том, что сайт изберкома непосредственно во время выборов парсился совсем не идеально. Работал медленно и с таймаутами.


  1. Yarique
    10.04.2018 15:25

    Я бы в этом цирке, не участвовал бы. Серьёзно портит репутацию. Еле сдержался, чтобы не плюнуть в монитор