Last active
November 24, 2016 10:59
-
-
Save reichaves/85e3e3e557089df57c8bca9dee30f974 to your computer and use it in GitHub Desktop.
Raspador principal e auxiliar do site do Senado
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import requests | |
import csv | |
from bs4 import BeautifulSoup | |
from senado_ferramentas2 import prepara_sopa | |
from senado_ferramentas2 import dicio_menu | |
from senado_ferramentas2 import gera_url | |
from senado_ferramentas2 import extrai_tabela | |
from senado_ferramentas2 import salva_csv | |
from senado_ferramentas2 import dicio_anos | |
if __name__ == '__main__': | |
# Acessar página principal e faz request | |
url = 'http://www25.senado.leg.br/web/transparencia/sen/' | |
r = prepara_sopa(url) | |
# Guardar lista de nomes de senadores e seus códigos - sopa e parse | |
seletor_gabinete = "#p_p_id_pesquisasenador_WAR_senadoresportlet_" | |
gabinetes = dicio_menu(r, seletor_gabinete) | |
# Deleta o primeiro nome, que é o cabeçalho | |
del gabinetes[0] | |
# Marca o ano atual, inicial, para o programa começar em todos os senadores | |
ano_atual = 2016 | |
header = True | |
# Iterar sobre lista de senadores | |
for gabinete in gabinetes.items(): | |
# Atualiza a url em cada senador para pegar o intervalo de anos | |
url = gera_url(gabinete,ano_atual) | |
#Teste | |
print (url) | |
print (gabinete[0]) | |
# Prepara nova sopa | |
r = prepara_sopa(url) | |
# Guardar lista de anos de cada senador | |
seletor_ano = "#conteudo_transparencia" | |
datas = dicio_anos(r, seletor_ano) | |
#Teste | |
print (datas) | |
# Iterar sobre lista de datas | |
for data in datas.items(): | |
# Gerar URL certa usando senador + data | |
url = gera_url(gabinete[1],data[1]) | |
# Acessar site usando função e pegando o objeto BeautifulSoup | |
soup = prepara_sopa(url) | |
# Aplicar função pra extrair tabela e gerar dicionário | |
tabela_final = extrai_tabela(soup, gabinete[0], data[0]) | |
# Função para salvar o dicionário no arquivo CSV | |
salva_csv(tabela_final, header) | |
header = False | |
# Exibe mensagem informando que terminou de gravar informações daquele gabinete | |
print ("Finalizado:", gabinete[0]) | |
# Exibe informação que programa foi concluído | |
print ("'Cabei! \o/") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import requests | |
import csv | |
from bs4 import BeautifulSoup | |
# Função para acessar página, baixar código HTML e abrir um objeto BeautifulSoup | |
def prepara_sopa(url): | |
''' | |
Cria objeto BeautifulSoup com o código HTML | |
url: string com o link da página | |
retorna: objeto BeautifulSoup | |
''' | |
try: | |
return requests.get(url) | |
except (requests.exceptions.HTTPError, requests.exceptions.RequestException, | |
requests.exceptions.ConnectionError, requests.exceptions.Timeout) as e: | |
print (str(e)) | |
pass | |
except Exception as e: | |
raise | |
return r | |
# Função para pegar lista de nomes e seus códigos | |
def dicio_menu(r, selector): | |
""" | |
Função para pegar a lista do menu e seus valores | |
sopa: objeto BeautifulSoup | |
selector: string com seletor do menu | |
retorna: dicionário com par opção:valor | |
""" | |
# Faz a sopa | |
soup = BeautifulSoup(r, 'lxml') | |
lista_opcoes = soup.select(selector)[0].find_all("option") | |
dicio = {} | |
for item in lista_opcoes: | |
nome = item.text.encode('utf-8') | |
valor = item.attrs['value'].encode('utf-8') | |
dicio[valor] = nome | |
return dicio | |
# Função para pegar lista de anos e o código de gabinete | |
def dicio_anos(r, selector): | |
""" | |
Função para pegar a lista do menu de anos e seus valores | |
sopa: objeto BeautifulSoup | |
selector: string com seletor do menu | |
retorna: dicionário com par opção:valor | |
""" | |
# Faz a nova sopa | |
soup = BeautifulSoup(r, 'lxml') | |
lista_opcoes = soup.select(selector)[0].find_all("li") | |
dicio = {} | |
for item in lista_opcoes: | |
#Extrai o ano | |
ano = item.text.encode('utf-8') | |
#Extrai o nome e corta apenas o código de cada senador | |
nome = item.a['href'] | |
inicio = int(nome.find('/sen') + 5) | |
final = int(nome.find('/?')) | |
nome2 = nome[inicio:final].encode('utf-8') | |
dicio[nome2] = ano | |
return dicio | |
# Função para gerar URL usando código e data | |
def gera_url(gabinete, ano): | |
""" | |
Gera uma url usando o código do gabinete e o ano selecionado | |
gabinete: string do seletor do menu senador | |
periodo: string do seletor do menu ano | |
retorna: string com URL | |
""" | |
url = 'http://www6g.senado.leg.br/transparencia/sen/{0}/?ano={1}'.format(gabinete, ano) | |
return url | |
# Função para extrair tabela da página e retornar dicionário com valores, | |
# incluindo gabinete e data | |
def extrai_tabela(soup, gabinete, ano): | |
""" | |
Extrai tabela HTML da página e inclui conta e período | |
sopa: objeto BeautifulSoup | |
gabinete: string | |
ano: string | |
retorna: lista - cada item é uma linha da tabela (a primeira é o cabeçalho) | |
""" | |
tabela_html = soup.select('#collapse-ceaps table tr') | |
tabela_final = [] | |
tabela_final.append(['Gabinete', 'Ano', 'Grupo', 'Total']) | |
for linha in tabela_html[1:-1]: | |
valor_grupo = linha.select('td')[0].text.encode('utf-8') | |
valor_total = linha.select('span')[0].text.strip().encode('utf-8') | |
tabela_final.append([gabinete, data, valor_grupo, valor_total]) | |
# Seleciona as linhas da tabela no código, cria uma lista | |
# da tabela Outros Gastos | |
tabela_gastos_html = soup.select('#collapse-outros-gastos table tr') | |
# Para cada linha na tabela final (pulando o cabeçalho) | |
for linha in tabela_gastos_html[1:-1]: | |
# Extrai o texto da primeira célula da linha | |
valor_grupo = linha.select('td')[0].text.encode('utf-8') | |
# Extrai o texto da segunda célula da linha e remove espaços | |
valor_total = linha.select('a')[0].text.strip().encode('utf-8') | |
# Adiciona a linha como um item na tabela final, com as quatro colunas | |
tabela_final.append([gabinete, ano, valor_grupo, valor_total]) | |
return tabela_final | |
# Função para salvar lista no arquivo CSV | |
def salva_csv(tabela_final, header): | |
""" | |
Salva uma lista de linhas no arquivo CSV | |
tabela_final: lista em que cada item é uma linha da tabela | |
header: booleano, indica se devemos escrever o cabeçalho ou não | |
retorna: nada | |
""" | |
with open('gasto_senado.csv', 'a') as f: | |
writer = csv.writer(f) | |
if header is True: | |
writer.writerow(tabela_final[0]) | |
writer.writerows(tabela_final[1:]) | |
return |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment