Skip to content

Instantly share code, notes, and snippets.

@reichaves
Last active November 24, 2016 10:59
Show Gist options
  • Save reichaves/85e3e3e557089df57c8bca9dee30f974 to your computer and use it in GitHub Desktop.
Save reichaves/85e3e3e557089df57c8bca9dee30f974 to your computer and use it in GitHub Desktop.
Raspador principal e auxiliar do site do Senado
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/")
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