http://habrahabr.ru/post/235977/
Добрый день, коллеги!
Как многие знают, 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/
Если есть потребность — называйте свои регионы и районы, я их тоже включу в задания для робота. Все регионы не стал пока сканировать, только Московская область, Москва и Питер, опасаюсь, как бы ЦИК не обиделся и не заблокировал парсер.
Замечания, советы, предложения, идеи дальнейшего развития, помощь в разработке приветствуются