Как посчитать явку
Постановка задачи¶
Подводятся итоги по выборам в Московскую городскую думу. Есть данные по выборам из системы ГАС «Выборы», публикующиеся более или менее в реальном времени. Но они там разбиты по округам (что логично). Допустим, нас интересует явка «в целом по Москве». По правде говоря, она интересует председателя территориальной избирательной комиссии, членом которой я являюсь — он только что спросил у меня, не опубликована ли эта информация где. Я не нашёл в открытых источниках и поэтому решил быстро написать скрипт, который её считает. Итак.
Шаг 1. Получаем список страниц со ссылками на результаты¶
Это придётся сделать частично ручками. Я зашёл на эту страницу и нашёл в исходном коде строчку, отвечающую за выпадающий список «Нижестоящие избирательные комиссии».
options_str="""<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772000001&tvd=27720001539819&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001539819">1 № 1</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772000136&tvd=27720001539954&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001539954">2 № 2</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772000226&tvd=27720001540044&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001540044">3 № 3</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772000321&tvd=27720001540139&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001540139">4 № 4</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772000408&tvd=27720001540226&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001540226">5 № 5</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772000508&tvd=27720001540326&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001540326">6 № 6</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772000586&tvd=27720001540404&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001540404">7 № 7</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772000664&tvd=27720001540482&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001540482">8 № 8</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772000753&tvd=27720001540571&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001540571">9 № 9</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772000842&tvd=27720001540660&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001540660">10 № 10</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772000923&tvd=27720001540741&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001540741">11 № 11</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772001003&tvd=27720001540821&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001540821">12 № 12</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772001073&tvd=27720001540891&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001540891">13 № 13</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772001149&tvd=27720001540967&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001540967">14 № 14</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772001245&tvd=27720001541063&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001541063">15 № 15</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772001323&tvd=27720001541141&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001541141">16 № 16</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772001405&tvd=27720001541223&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001541223">17 № 17</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772001479&tvd=27720001541297&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001541297">18 № 18</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772001567&tvd=27720001541385&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001541385">19 № 19</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772001647&tvd=27720001541465&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001541465">20 № 20</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772001725&tvd=27720001541543&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001541543">21 № 21</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772001802&tvd=27720001541620&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001541620">22 № 22</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772001878&tvd=27720001541696&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001541696">23 № 23</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772001952&tvd=27720001541770&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001541770">24 № 24</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772002055&tvd=27720001541873&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001541873">25 № 25</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772002124&tvd=27720001541942&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001541942">26 № 26</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772002191&tvd=27720001542009&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001542009">27 № 27</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772002258&tvd=27720001542076&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001542076">28 № 28</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772002339&tvd=27720001542157&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001542157">29 № 29</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772002411&tvd=27720001542229&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001542229">30 № 30</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772002486&tvd=27720001542304&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001542304">31 № 31</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772002559&tvd=27720001542377&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001542377">32 № 32</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772002654&tvd=27720001542472&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001542472">33 № 33</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772002734&tvd=27720001542552&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001542552">34 № 34</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772002830&tvd=27720001542648&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001542648">35 № 35</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772002922&tvd=27720001542740&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001542740">36 № 36</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772003003&tvd=27720001542821&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001542821">37 № 37</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772003101&tvd=27720001542919&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001542919">38 № 38</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772003203&tvd=27720001543021&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001543021">39 № 39</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772003295&tvd=27720001543113&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001543113">40 № 40</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772003378&tvd=27720001543196&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001543196">41 № 41</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772003457&tvd=27720001543275&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001543275">42 № 42</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772003543&tvd=27720001543361&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001543361">43 № 43</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772003621&tvd=27720001543439&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001543439">44 № 44</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&root=772003707&tvd=27720001543525&vrn=27720001539308&prver=0&pronetvd=null&region=77&sub_region=77&type=0&vibid=27720001543525">45 № 45</option>
"""
Шаг 2. Обрабатываем один округ¶
Прежде, чем писать код, обрабатывающий весь город, напишем его для одного округа. Для начала нам нужно получить получить из строчки выше адреса страниц по отдельным округам. Чтобы распарсить строчку выше, мы используем BeautifulSoup
.
from bs4 import BeautifulSoup
import urllib2
options=BeautifulSoup(options_str)
Возьмём первый элемент типа option
и вытащим из него название ОИК (окружной комиссии) и url страницы, относящейся к этой ОИК.
option=options.find("option")
url=option.get('value')
OIK=option.string
print "url = %s\nOIK = %s" % (url, OIK)
Эта страница не содержит нужной таблицы, но содержит ссылку на неё. Это предпоследняя ссылка на странице.
page=urllib2.urlopen(url)
data=BeautifulSoup(page.read())
a=data.findAll("a")[-2]
url_res=a.get('href')
res_page=urllib2.urlopen(url_res)
bigtable=BeautifulSoup(res_page.read())
Теперь найдём нужную табличку (точнее, нужный тег <table>
) на этой странице. Делается внимательным вглядыванием в исходник или методом научного тыка.
rows=bigtable.findAll('table')[2].findAll('table')[4].findAll('tr')
rows[0]
Нужная нам информация в третьей ячейке, в теге <b>
. И мы хотим получить число, а не строчку. Нам придётся запрашивать эту информацию для разных строчек, поэтому определим функцию
def getdata(i):
return int(rows[i].findAll('td')[2].find('b').string)
getdata(0)
Нас интересуют только некоторые строчки в протоколе. (По правде сказать, я сейчас запрашиваю их больше, чем надо, чтобы вычислить явку. Но пусть будут.)
protocol_line=[getdata(i) for i in [0,2,3,4,8,9]]
total,v_pomesch,dosrok,nadom,nedeistv,deistv=protocol_line
total
Теперь можно посчитать явку
yavka=float(v_pomesch+dosrok+nadom)/total
print yavka*100
Шаг 3. Получаем информацию по всем округам¶
Мы хотим общую явку по всей Москве. Для этого мы запросим данные по каждому округу, суммируем общее число избирателей и бюллетеней и посчитаем явку по этим данным. Нам понадобится объединить код, написанный выше, и поместить его в цикл.
cumulative_line=[0 for i in xrange(6)]
#инииализируем список нулями
for option in options.findAll("option"):
url=option.get('value')
OIK=option.string
page=urllib2.urlopen(url)
data=BeautifulSoup(page.read())
a=data.findAll("a")[-2]
url_res=a.get('href')
res_page=urllib2.urlopen(url_res)
bigtable=BeautifulSoup(res_page.read())
rows=bigtable.findAll('table')[2].findAll('table')[4].findAll('tr')
def getdata(i):
return int(rows[i].findAll('td')[2].find('b').string)
protocol_line=[getdata(i) for i in [0,2,3,4,8,9]]
total,v_pomesch,dosrok,nadom,nedeistv,deistv=protocol_line
cumulative_line=[x+y for x,y in zip(cumulative_line,protocol_line)]
yavka=float(v_pomesch+dosrok+nadom)/total
print OIK+" "+str(yavka)
print cumulative_line
total,v_pomesch,dosrok,nadom,nedeistv,deistv=cumulative_line
yavka=float(v_pomesch+dosrok+nadom)/total
print yavka
Ответ¶
Явка на момент напиания поста по публично доступным данным «ГАС „Выборы”» составляет 21%.
Комментарии