Django
Open data
September 2014 8

Сервис данных по выборам и кандидатам

Добрый день, коллеги!

Как многие знают, 14 сентября 2014 года пройдет единый день голосования, во многих регионах России выбирают себе депутатов и иногда мэров.
При этом информационное обеспечение, на мой взгляд, хромает. Главное неудобство заключается в том, что информацию о кандидатах невозможно посмотреть списком, только список без подробностей (к тому же разбитый на страницы по 20 человек) и по одному человеку с подробностями.

Солнечным летним днем пришла мне идея вытащить эту информацию, чтобы можно было её удобно анализировать и выбирать кандидатов наглядно и с умом. К сожалению, ЦИК не предоставляет каких либо экспортных вариантов по всем выборам (я по крайней мере не нашел), поэтому решение — парсинг страничек роботом.


Первое решение было на Скале, мне хотелось закрепить знание в языке и разобраться с новым для меня фреймворком Play. Парсер написал, протестировал, но, к сожалению, документацию к Play не осилил, долго не мог найти ответ на какой-то начальный вопрос. После этого решил разобраться с фреймворком Django, благо с документацией всё обстояло гораздо лучше, соответственно парсер был переписан под Python.

Проект можно посмотреть на Github, от парсера на Скале осталась папка «scala-parser».

В процессе разработки, при составлении моделей, выяснился замечательный бонус, мы можем получить всю историю участия кандидата в выборах ( с 2007 года, когда ЦИК перешел на текущий формат, старый я не парсил, тем более это дало бы максимум +1 выборы к истории, сам ресурс стартовал в 2003 году). Это, на самом деле, можно считать основной ценностью проекта, так как теперь избиратель может получить полноту информации, где, когда и с кем участвовал в выборах тот или иной кандидат. В списке выборов выведена колонка, сколько раз кандидат участвовал в выборах и можно перейти на страницу кандидата, посмотреть все его выборы и всю информацию. Насколько мне известно, пара ФИО + дата рождения уникальна для граждан России, так что ошибок не будет.

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

Парсинг сайта на питоне с помощью библиотеки BeautifulSoup можно посмотреть тут. Во время разработки пришлось решать проблему с комиссиями, которые иногда путаются с датами кандидатов и их ФИО при занесении в базу, я проверяю дату обновления всех записей информации по окончанию обработки выборов. Если дата обновления информации по кандидату сильно меньше даты обновления выборов — эта информация лишняя, её можно удалить.

А дальше идет уже самый обычный Django проект, который особого интереса не представляет

Для динамических фильтров и сортировок в таблице используется js-библиотека http://tablefilter.free.fr/

Первоначально проект был размещен на Heroku, но я довольно быстро превысил бесплатный лимит на базу данных ( не более 10000 строк), сейчас, после парсинга выборов Московской области, Москвы и Питера количество кандидатов около 50 тысяч. Клич в фейсбуке о спонсировании проекта дал мне бесплатный виртуальный сервер от Сергея Арсентьева, за что ему большое спасибо!

Это был для меня первый опыт настройки linux-сервера по ssh под Django-проект через Gunicorn с Nginx, так что рост знаний просто удивительный получился. Остался один вопрос, логи почему-то не пишутся при запуске через Upstart, если кто в теме — помогите . Конфиги Upstart и Nginx можно тоже найти на гитхабе.

Собственно, сама ссылка на работающий сайт
elections.istra-da.ru

К примеру информацию по выборам в Московскую городскую думу можно найти тут:
elections.istra-da.ru/election/1399

Если есть потребность — называйте свои регионы и районы, я их тоже включу в задания для робота. Все регионы не стал пока сканировать, только Московская область, Москва и Питер, опасаюсь, как бы ЦИК не обиделся и не заблокировал парсер.

Замечания, советы, предложения, идеи дальнейшего развития, помощь в разработке приветствуются
+10
2.5k 15
Comments 5
Top of the day