CamaraDosDeputados / dados-abertos

Repositório do serviço de Dados Abertos da Câmara. Consulte as "Issues" para atendimento a dúvidas e sugestões.
http://dadosabertos.camara.leg.br
198 stars 13 forks source link

Velocidade de requisições #284

Open reichaves opened 4 years ago

reichaves commented 4 years ago

Olá Por favor, estou acessando a API para detalhes das proposições (exemplo - https://dadosabertos.camara.leg.br/api/v2/proposicoes/197605) Mas fiz um script para fazer várias requisições, uma por vez. Porém sempre tem um erro depois de algumas feitas, porque retorna vazia: JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Há algum problema na velocidade de resposta?

EquipeDadosAbertosCD commented 4 years ago

Olá, Reinaldo!

Obrigado pelo contato e pelo interesse no Dados Abertos.

Parece provável que seu script esteja passando do limite de requisições por segundo. Experimente inserir um intervalo de 100ms entre elas.

De toda forma, pelo que você descreveu, não dá para saber exatamente o problema ocorrido, e tudo indica que sua aplicação não está fazendo a verificação do status code da resposta antes de tentar processar o que recebeu. Um código igual ou maior que 400 indica que houve um problema e que, muito provavelmente, o corpo da resposta não é o que você estava esperando.

Abraço!

Fabricio Rocha Equipe Dados Abertos - Câmara

reichaves commented 4 years ago

Olá Fabricio Obrigado

Aqui o código, para tramitações que usei:

import pandas as pd
import requests

kwargs = {'sep': ',', 'dtype': str, 'encoding': 'utf-8'}
encontrados = pd.read_csv("resultados/camara/exemplo_proposicoes.csv", **kwargs)

encontrados.info()

endpoint = "https://dadosabertos.camara.leg.br/api/v2/proposicoes/"

projetos = []

for num, row in encontrados.iterrows():
    id = row['id']
    siglaTipo = row['siglaTipo']
    ano = row['ano']
    ementa = row['ementa']

    url = endpoint + id + "/tramitacoes"

    print(url)

    parametros = {'formato': 'json'}
    resposta = requests.get(url, parametros)

    for vez in resposta.json()['dados']:
      dicionario = {"id": id, 
      "siglaTipo": siglaTipo, 
      "ano": ano, 
      "ementa": ementa, 
      "dataHora": str(vez['dataHora']).strip(), 
                          "sequencia": str(vez['sequencia']).strip(), 
                          "siglaOrgao": str(vez['siglaOrgao']).strip(), 
                          "uriOrgao": str(vez['uriOrgao']).strip(), 
                          "regime": str(vez['regime']).strip(), 
                          "descricaoTramitacao": str(vez['descricaoTramitacao']).strip(), 
                          "codTipoTramitacao": str(vez['codTipoTramitacao']).strip(),
                          "descricaoSituacao": str(vez['codTipoTramitacao']).strip(),
                          "codSituacao": str(vez['codSituacao']).strip(),
                          "despacho": str(vez['despacho']).strip(),
                          "url": str(vez['url']).strip(),
                          "ambito": str(vez['ambito']).strip()
                          }
      projetos.append(dicionario)

df_projetos_api = pd.DataFrame(projetos)

No arquivo exemplo_proposicoes.csv estão os ids. O arquivo está aqui: https://drive.google.com/file/d/1pYxt06_QU-N4CCxVYEYkb_XWSrXOHJ_1/view?usp=sharing

Até o ano passado este código funcionava muito rápido, sem erro, para mais de 8.000 requisições

Agora, após algumas requisições sempre dá erro, como se a requisição voltasse vazia:


JSONDecodeError Traceback (most recent call last)

in 12 resposta = requests.get(url, parametros) 13 ---> 14 for vez in resposta.json()['dados']: 15 dicionario = {"id": id, 16 "siglaTipo": siglaTipo, ~/Documentos/Code/reinaldo/lib/python3.6/site-packages/requests/models.py in json(self, **kwargs) 895 # used. 896 pass --> 897 return complexjson.loads(self.text, **kwargs) 898 899 @property /usr/lib/python3.6/json/__init__.py in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw) 352 parse_int is None and parse_float is None and 353 parse_constant is None and object_pairs_hook is None and not kw): --> 354 return _default_decoder.decode(s) 355 if cls is None: 356 cls = JSONDecoder /usr/lib/python3.6/json/decoder.py in decode(self, s, _w) 337 338 """ --> 339 obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 340 end = _w(s, end).end() 341 if end != len(s): /usr/lib/python3.6/json/decoder.py in raw_decode(self, s, idx) 355 obj, end = self.scan_once(s, idx) 356 except StopIteration as err: --> 357 raise JSONDecodeError("Expecting value", s, err.value) from None 358 return obj, end JSONDecodeError: Expecting value: line 1 column 1 (char 0) Então por isso é que achei que o problema é a velocidade Por favor, sabe se é isso mesmo?