Как посчитать явку

Постановка задачи

Подводятся итоги по выборам в Московскую городскую думу. Есть данные по выборам из системы ГАС «Выборы», публикующиеся более или менее в реальном времени. Но они там разбиты по округам (что логично). Допустим, нас интересует явка «в целом по Москве». По правде говоря, она интересует председателя территориальной избирательной комиссии, членом которой я являюсь — он только что спросил у меня, не опубликована ли эта информация где. Я не нашёл в открытых источниках и поэтому решил быстро написать скрипт, который её считает. Итак.

Шаг 1. Получаем список страниц со ссылками на результаты

Это придётся сделать частично ручками. Я зашёл на эту страницу и нашёл в исходном коде строчку, отвечающую за выпадающий список «Нижестоящие избирательные комиссии».

In [6]:
options_str="""<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772000001&amp;tvd=27720001539819&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001539819">1 № 1</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772000136&amp;tvd=27720001539954&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001539954">2 № 2</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772000226&amp;tvd=27720001540044&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001540044">3 № 3</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772000321&amp;tvd=27720001540139&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001540139">4 № 4</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772000408&amp;tvd=27720001540226&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001540226">5 № 5</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772000508&amp;tvd=27720001540326&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001540326">6 № 6</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772000586&amp;tvd=27720001540404&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001540404">7 № 7</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772000664&amp;tvd=27720001540482&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001540482">8 № 8</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772000753&amp;tvd=27720001540571&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001540571">9 № 9</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772000842&amp;tvd=27720001540660&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001540660">10 № 10</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772000923&amp;tvd=27720001540741&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001540741">11 № 11</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772001003&amp;tvd=27720001540821&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001540821">12 № 12</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772001073&amp;tvd=27720001540891&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001540891">13 № 13</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772001149&amp;tvd=27720001540967&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001540967">14 № 14</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772001245&amp;tvd=27720001541063&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001541063">15 № 15</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772001323&amp;tvd=27720001541141&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001541141">16 № 16</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772001405&amp;tvd=27720001541223&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001541223">17 № 17</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772001479&amp;tvd=27720001541297&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001541297">18 № 18</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772001567&amp;tvd=27720001541385&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001541385">19 № 19</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772001647&amp;tvd=27720001541465&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001541465">20 № 20</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772001725&amp;tvd=27720001541543&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001541543">21 № 21</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772001802&amp;tvd=27720001541620&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001541620">22 № 22</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772001878&amp;tvd=27720001541696&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001541696">23 № 23</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772001952&amp;tvd=27720001541770&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001541770">24 № 24</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772002055&amp;tvd=27720001541873&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001541873">25 № 25</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772002124&amp;tvd=27720001541942&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001541942">26 № 26</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772002191&amp;tvd=27720001542009&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001542009">27 № 27</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772002258&amp;tvd=27720001542076&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001542076">28 № 28</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772002339&amp;tvd=27720001542157&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001542157">29 № 29</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772002411&amp;tvd=27720001542229&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001542229">30 № 30</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772002486&amp;tvd=27720001542304&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001542304">31 № 31</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772002559&amp;tvd=27720001542377&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001542377">32 № 32</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772002654&amp;tvd=27720001542472&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001542472">33 № 33</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772002734&amp;tvd=27720001542552&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001542552">34 № 34</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772002830&amp;tvd=27720001542648&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001542648">35 № 35</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772002922&amp;tvd=27720001542740&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001542740">36 № 36</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772003003&amp;tvd=27720001542821&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001542821">37 № 37</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772003101&amp;tvd=27720001542919&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001542919">38 № 38</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772003203&amp;tvd=27720001543021&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001543021">39 № 39</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772003295&amp;tvd=27720001543113&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001543113">40 № 40</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772003378&amp;tvd=27720001543196&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001543196">41 № 41</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772003457&amp;tvd=27720001543275&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001543275">42 № 42</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772003543&amp;tvd=27720001543361&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001543361">43 № 43</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772003621&amp;tvd=27720001543439&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001543439">44 № 44</option>
<option value="http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city?action=show&amp;root=772003707&amp;tvd=27720001543525&amp;vrn=27720001539308&amp;prver=0&amp;pronetvd=null&amp;region=77&amp;sub_region=77&amp;type=0&amp;vibid=27720001543525">45 № 45</option>
"""

Шаг 2. Обрабатываем один округ

Прежде, чем писать код, обрабатывающий весь город, напишем его для одного округа. Для начала нам нужно получить получить из строчки выше адреса страниц по отдельным округам. Чтобы распарсить строчку выше, мы используем BeautifulSoup.

In [82]:
from bs4 import BeautifulSoup
import urllib2
In [83]:
options=BeautifulSoup(options_str)

Возьмём первый элемент типа option и вытащим из него название ОИК (окружной комиссии) и url страницы, относящейся к этой ОИК.

In [119]:
option=options.find("option")
url=option.get('value')
OIK=option.string
print "url = %s\nOIK = %s" % (url, OIK)
url = 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
OIK = 1 № 1

Эта страница не содержит нужной таблицы, но содержит ссылку на неё. Это предпоследняя ссылка на странице.

In [87]:
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>) на этой странице. Делается внимательным вглядыванием в исходник или методом научного тыка.

In [96]:
rows=bigtable.findAll('table')[2].findAll('table')[4].findAll('tr')
In [108]:
rows[0]
Out[108]:
<tr bgcolor="#CCCCCC">
<td style="color:black">1</td>
<td align="left" style="color:black">Число избирателей, внесенных в список</td>
<td align="right" style="color:black"><b>43891</b><br/>
</td>
</tr>

Нужная нам информация в третьей ячейке, в теге <b>. И мы хотим получить число, а не строчку. Нам придётся запрашивать эту информацию для разных строчек, поэтому определим функцию

In [109]:
def getdata(i):
    return int(rows[i].findAll('td')[2].find('b').string)
In [110]:
getdata(0)
Out[110]:
43891

Нас интересуют только некоторые строчки в протоколе. (По правде сказать, я сейчас запрашиваю их больше, чем надо, чтобы вычислить явку. Но пусть будут.)

In [112]:
protocol_line=[getdata(i) for i in [0,2,3,4,8,9]]
total,v_pomesch,dosrok,nadom,nedeistv,deistv=protocol_line
In [113]:
total
Out[113]:
43891

Теперь можно посчитать явку

In [115]:
yavka=float(v_pomesch+dosrok+nadom)/total
print yavka*100
25.7866077328

Шаг 3. Получаем информацию по всем округам

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

In [120]:
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
1 № 1 0.251854011194
2 № 2 0.193819133376
3 № 3 0.196984611903
4 № 4 0.216774952295
5 № 5 0.212607794033
6 № 6 0.20927271066
7 № 7 0.208447209331
8 № 8 0.200478017558
9 № 9 0.211760749624
10 № 10 0.201296963693
11 № 11 0.18430057448
12 № 12 0.20830927544
13 № 13 0.206482195345
14 № 14 0.208050739566
15 № 15 0.199925291692
16 № 16 0.215400317351
17 № 17 0.229564897255
18 № 18 0.235494349183
19 № 19 0.22132647112
20 № 20 0.222537600285
21 № 21 0.239083979205
22 № 22 0.207633425473
23 № 23 0.197300484097
24 № 24 0.225106311816
25 № 25 0.213489976532
26 № 26 0.21805089533
27 № 27 0.219585368416
28 № 28 0.210643090286
29 № 29 0.202506084677
30 № 30 0.200106606465
31 № 31 0.207610052285
32 № 32 0.22042565498
33 № 33 0.193313639721
34 № 34 0.196784623142
35 № 35 0.206833402158
36 № 36 0.208934467782
37 № 37 0.201748953495
38 № 38 0.232412499038
39 № 39 0.227860063257
40 № 40 0.19828916162
41 № 41 0.185056980925
42 № 42 0.197368749532
43 № 43 0.212601933359
44 № 44 0.190732820621
45 № 45 0.207604135698
[7116699, 1378931, 27123, 86568, 50605, 1437614]
0.209735159517

Ответ

Явка на момент напиания поста по публично доступным данным «ГАС „Выборы”» составляет 21%.

Комментарии