Rodar código Python em todas as páginas - JSON

Oi, pessoal!

Estou rodando um código Python que faz requisições à API da Câmara dos Deputados. O JSON tem várias páginas, eu rodo esse código todo dia e todo dia ele tem um número de páginas diferentes (depende quantas proposições tramitaram no dia anterior). Hoje, que eu rodo o código manualmente, o que eu faço é ver quantas páginas ele retorna e rodar o código no número de páginas pré-determinado. Todo dia eu vejo aqui quantas páginas existem:
https://dadosabertos.camara.leg.br/api/v2/proposicoes?dataInicio=2020-02-03&dataFim=2020-02-04&ordem=ASC&ordenarPor=id

lista = range(1,60) #páginas que a API retorna
for pagina in lista: #configurando função para cada página
print(pagina)
parametros = {‘formato’: ‘json’, ‘itens’: 15, ‘pagina’: pagina}
resposta = requests.get(url, parametros)
for proposicao in resposta.json()[‘dados’]: #pegando dados das proposições (id, número, ano, tipo, link, etc)

O que eu quero agora é colocar esse código pra rodar todos os dias automaticamente. Logo, eu preciso que ele rode em todas as páginas sozinho, sem que eu precise ficar mudando os números. Alguém tem algum caminho ou solução?

O código completo é esse aqui: https://github.com/baliborio/elasnacamara

Obrigada!

1 Curtida

Olá

Você pode capturar o dia anterior automaticamente e formar a url com isso

Mas eu acho que a API da Câmara está com pau (como falamos essa semana), e agora um que ainda não tinha visto

from datetime import datetime, timedelta
import requests
import pandas as pd

# Captura o dia, mês e ano de ontem
dia_anterior = (datetime.now() - timedelta(1)).strftime('%d')
mes_anterior = (datetime.now() - timedelta(1)).strftime('%m')
ano_anterior = (datetime.now() - timedelta(1)).strftime('%Y')

# Captura o dia, mês e ano de hoje
now = datetime.now()
dia_hoje = now.strftime("%d")
mes_hoje = now.strftime("%m")
ano_hoje = now.strftime("%Y")

# Forma url de pesquisa
url = "https://dadosabertos.camara.leg.br/api/v2/proposicoes?dataInicio=%s-%s-%s&dataFim=%s-%s-%s&ordem=ASC&ordenarPor=id" % (ano_anterior, mes_anterior, dia_anterior, ano_hoje, mes_hoje, dia_hoje)
print(url)

# Captura quantas páginas tem esse intervalo de data na API
parametros = {'formato': 'json', 'itens': 100}
resposta = requests.get(url, parametros)
    
for vez in resposta.json()['links']:
	conta = {"rel": vez['rel'].strip(), "href": vez['href'].strip()}

# Para este item da API da Câmara sempre o último item link (last) tem o número de páginas
# Considerando 100 itens por página

# Isola o endereço de last
link_ultimo = str(conta['href'].strip())

# Encontra local exato onde termina o número de páginas
posicao = int(link_ultimo.find('&itens='))

# Com um fatiamento de lista, a partir da posição 139 onde sempre está o número, captura o número
# de caracteres que corresponde a "posicao"
# Exemplo: se "posicao" tiver 141 então vai ser [139:141]
# o que significa comprimento de 139 (inclusive) até 141 (exclusive)
# E adiciono mais 1 porque o range abaixo sempre vai um menos
ultima = int(link_ultimo[139:posicao]) + 1

# Cria lista vazia
proposicoes = []

# Faz a iteração a partir do número de páginas encontrado
for pagina in range(1, ultima):
	parametros = {'formato': 'json', 'itens': 100, 'pagina': pagina}
    resposta = requests.get(url, parametros)

	# Captura os dados          
    for vez in resposta.json()['dados']:
            dicionario = {"id": str(vez['id']).strip(), 
                          "uri": str(vez['uri']).strip(), 
                          "siglaTipo": str(vez['siglaTipo']).strip(), 
                          "codTipo": str(vez['codTipo']).strip(), 
                          "numero": str(vez['numero']).strip(), 
                          "ano": str(vez['ano']).strip(), 
                          "ementa": str(vez['ementa']).strip()
                          }
            proposicoes.append(dicionario)

df_proposicoes_api = pd.DataFrame(proposicoes)
df_proposicoes_api.info()
df_proposicoes_api.to_excel('resultados/testeproposicoes.xlsx',sheet_name='Sheet1')

O resultado do intervalo “dataInicio=2020-02-04&dataFim=2020-02-05” tem datas a partir de 1996

Mesmo se você ver no browser o resultado: https://dadosabertos.camara.leg.br/api/v2/proposicoes?dataInicio=2020-02-04&dataFim=2020-02-05&ordem=ASC&ordenarPor=id

E também tiraram os itens de procura com datas da documentação da API: https://dadosabertos.camara.leg.br/swagger/api.html
(Correção - em /proposicoes estão as informações para busca por datas)

"Lista de informações básicas sobre projetos de lei, resoluções, medidas provisórias, emendas, pareceres e todos os outros tipos de proposições na Câmara.

Por padrão, são retornadas todas as proposições que foram apresentadas ou tiveram alguma mudança de situação nos últimos 30 dias. Esse intervalo de tramitação pode ser configurado pelos parâmetros dataInicio e dataFim ."

Então faz sentido retornar proposições antigas

3 Curtidas

Oi, Barbara. Tudo bem?

Quem já me ajudou a resolver inconsistências ou problemas com dados da Câmara foi o Fabrício Rocha, da equipe de dados abertos. Uma vez também recomendei ao Menegat para falar com o Fabrício em uma discussão no DDJ, e eu acho que deu certo.

O e-mail dele é [email protected]. Não achei o telefone por aqui.

2 Curtidas

Funcionou! :slight_smile: Muito obrigada, Reinaldo!

1 Curtida

Obrigada, Gabriela! O Fabrício é ótimo mesmo, ele também andou me ajudando com algumas instabilidades da API.

1 Curtida