-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathscraper.py
122 lines (106 loc) · 4.57 KB
/
scraper.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
from urllib.request import urlopen, urlretrieve
from urllib.parse import urlparse, urljoin, quote
from bs4 import BeautifulSoup
import json, os, re
url_vereadores = "http://www.saopaulo.sp.leg.br/vereadores/?filtro=ordem-alfabetica"
url_mesa = "http://www.saopaulo.sp.leg.br/vereadores/?filtro=mesa-diretora"
url_comissoes = "http://www.saopaulo.sp.leg.br/atividade-legislativa/comissoes/?p="
# TODO: deduzir IDs pela página ao invés de hardcoded
p_comissoes = [
"41810",
"41824",
"41815",
"41603",
"41817",
"41823",
"41816",
"86804",
"41802",
"41609",
"41826",
"41809",
"41806"
]
# variaveis a preencher
vereadores = []
partidos = []
comissoes = []
# baixa uma foto para uma pasta e retorna seu diretório
def getfoto(url, base_path):
a = urlparse(url)
encoded_link = urljoin(url, quote(a.path.encode("utf-8")))
path = os.path.join(base_path, os.path.basename(a.path))
if not os.path.exists(path):
urlretrieve(encoded_link, path)
return path
# exporta json do mesmo modo para cada lista
def savejson(data, path):
with open(path, 'w', encoding='utf-8') as out:
json.dump(data, out, ensure_ascii=False, indent=2, sort_keys=True)
# cria lista de vereadores
page_vereadores = urlopen(url_vereadores)
soup_vereadores = BeautifulSoup(page_vereadores, 'html.parser')
vereadores_list = soup_vereadores.select("article.vereador-profile-thumb")
for elem in vereadores_list:
vereador = {}
img_partido = elem.find(attrs={"class":"vereador-party"}).find("img")
img_vereador = elem.find(attrs={"class":"vereador-picture"}).find("img")
vereador["foto"] = getfoto(img_vereador.get("src"), "fotos/")
a_vereador = elem.find(attrs={"class":"vereador-name"}).find("a")
vereador["url"] = a_vereador.get("href")
vereador["nome"] = a_vereador.string.strip()
vereador["partido"] = img_partido.get("title")
vereadores.append(vereador)
# busca se partido já foi gravado, se não cria entrada
if not any(p["sigla"] == vereador["partido"] for p in partidos):
partido = {}
partido["sigla"] = vereador["partido"]
partido["img"] = getfoto(img_partido.get("src"), "partidos/")
partidos.append(partido)
# adiciona mesa diretora a vereadores
page_mesa = urlopen(url_mesa)
soup_mesa = BeautifulSoup(page_mesa, 'html.parser')
mesa_list = soup_mesa.select("article.vereador-profile-thumb")
for elem in mesa_list:
nome = elem.find(attrs={"class":"vereador-name"}).find("a").string.strip()
vereador = next((x for x in vereadores if x["nome"] == nome), None)
if vereador != None:
vereador["mesa_diretora"] = elem.find(attrs={"class":"vereador-position"}).string.strip()
# cria comissões e adiciona comissões à lista de vereadores
for comissao in p_comissoes:
url_comissao = url_comissoes + comissao
page_comissao = urlopen(url_comissao)
soup_comissao = BeautifulSoup(page_comissao, 'html.parser')
comissao = {}
comissao["nome"] = soup_comissao.find("header", attrs={"class":"article-header"}).find(attrs={"class":"page-title"}).string.strip()
img_comissao = soup_comissao.find("img", attrs={"class":"wp-post-image"})
comissao["logo"] = getfoto(img_comissao.get("src"), "comissoes/")
# busca membros da comissão
comissao_list = soup_comissao.select("article.vereador-profile-thumb")
comissao["membros"] = {}
for elem in comissao_list:
nome = elem.find(attrs={"class":"vereador-name"}).find("a").string.strip()
cargo = elem.find("h4").string.strip()
comissao["membros"][nome] = cargo
vereador = next((x for x in vereadores if x["nome"] == nome), None)
if vereador != None:
try:
vereador["comissoes"][comissao["nome"]] = cargo
except KeyError:
vereador["comissoes"] = {comissao["nome"] : cargo}
comissoes.append(comissao)
# busca salas de cada vereador
for vereador in vereadores:
page_vereador = urlopen(vereador["url"])
soup_vereador = BeautifulSoup(page_vereador, 'html.parser')
tag_andar = soup_vereador.find(attrs={"class":"vereador-data"}).find(text=re.compile(r'Andar:'))
if tag_andar is not None:
andar = int(re.search(r'\d+', tag_andar.parent.parent.__str__()).group())
vereador["andar"] = andar
tag_sala = soup_vereador.find(attrs={"class":"vereador-data"}).find(text=re.compile(r'Sala:'))
if tag_sala is not None:
sala = int(re.search(r'\d+', tag_sala.parent.parent.__str__()).group())
vereador["sala"] = sala
savejson(vereadores, "dados/vereadores.json")
savejson(partidos, "dados/partidos.json")
savejson(comissoes, "dados/comissoes.json")