Skip to content

Instantly share code, notes, and snippets.

@aandr
Last active August 29, 2015 14:01
Show Gist options
  • Save aandr/cfa3c1b2b8721216a781 to your computer and use it in GitHub Desktop.
Save aandr/cfa3c1b2b8721216a781 to your computer and use it in GitHub Desktop.
Scraper за протоколите от ЦИК за Избори за ЕП 2014

Инструкции

  1. Инсталирате нужните пакети:

    pip install pyquery

или в някои версии на Ubuntu:

 sudo apt-get install python-pyquery
  1. Сваляте уеб страниците за протоколите чрез wget:

    wget -r -nc -l2 --reject=pdf http://results.cik.bg/ep2014/protokoli/01/index.html

  2. Изпълнявате файла parse.py, като подадете пътя към "protokoli"

    python parse.py results.cik.bg/ep2014/protokoli

  3. Резултатите са тук: https://www.dropbox.com/sh/i4ad94x9i6okgrd/AAAioCeEDoEBdfAhHNp1EIEDa

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import os, sys, codecs
from pyquery import PyQuery as pq
from multiprocessing import Pool
def list_files(base_dir):
for area in range(1, 32):
curr_dir = base_dir + '/%02d' % area
files = os.listdir(curr_dir)
for f in files:
if f.endswith('.html') and f not in ('index.html', 'list.html'):
yield (area, f[0:-5], curr_dir + '/' + f)
def get_headings():
res= ['Регион', 'Секция', 'Листи', 'Общо бюлетини', 'Избиратели по списък', 'част 1', 'част 2', 'под черта', 'гласували', 'удостоверения чл. 40', 'чл. 240', 'неизползвани', 'унищожени', 'по чл 265', 'чл. 227', 'чл. 228', 'сгрешени', 'намерени', 'намерени недействителни', 'действителни']
for i in (1,2,3,4,6,8,9,10,11,12,13,15,16,17,18,19,20,21,25,26,27,28,29,30):
res.append('%d действ' % i)
res.append('%d недейств' % i)
return res
def escape(text):
return '"' + text.strip().replace('"', '') + '"'
def parse_file(args):
area, id, filename = args
print area, id
d = pq(filename=filename)
results = [str(area), str(id)]
tables = d('table')
for t in range(0,5):
table = tables.eq(t)
row = 0
for el in d('tr', table):
if t == 4 and row == 0:
row += 1
continue
parts = d('td', el)
if t == 4:
results.append(escape(parts[2].text))
results.append(escape(parts[3].text))
elif len(parts) > 1:
results.append(escape(parts[1].text))
row += 1
return results
def parse_all(base_dir='protokoli'):
files = list(list_files(base_dir))
p = Pool(5)
results = [get_headings()] + p.map(parse_file, files, 3)
return results
def save_to_csv(results):
f = codecs.open('ep2014.csv', 'w', 'utf-8')
for line in results:
f.write(",".join(line) + "\r\n")
f.close()
if __name__ == '__main__':
results = parse_all(sys.argv[1])
save_to_csv(results)
@yurukov
Copy link

yurukov commented May 26, 2014

Браво! Преференциите може ли да ги включим и тях? Добави и имената на общината и населеното място, за по-лесно намиране.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment