Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Dúvida sobre importação JSON

Olá, bom dia!

Tudo bom?

Estou tendo problemas ao importar as bases de dados em formato JSON. Estou utilizando o vscode com a extensão do jupyter notebook instalada, já fiz alguns cursos da Alura na escola de DataScience e é a primeira vez que acontece tal erro.

Faço a declaração da variável da URL dos dados de hospedagem:

url_dados_hospedagem = 'https://cdn3.gnarususercontent.com.br/2928-transformacao-manipulacao-dados/dados_hospedagem.json'

em seguida, faço a leitura da url:

dados_hospedagem = pd.read_json(url_dados_hospedagem)

Porém, tive esse erro como retorno:


**---------------------------------------------------------------------------
HTTPError                                 Traceback (most recent call last)
Cell In[31], line 1
----> 1 dados_hospedagem = pd.read_json(url_dados_hospedagem)

**File c:\ProgramData\anaconda3\Lib\site-packages\pandas\io\json\_json.py:780, in read_json(path_or_buf, orient, typ, dtype, convert_axes, convert_dates, keep_default_dates, precise_float, date_unit, encoding, encoding_errors, lines, chunksize, compression, nrows, storage_options, dtype_backend, engine)
    777 if convert_axes is None and orient != "table":
    778     convert_axes = True
--> 780 json_reader = JsonReader(
    781     path_or_buf,
    782     orient=orient,
    783     typ=typ,
    784     dtype=dtype,
    785     convert_axes=convert_axes,
    786     convert_dates=convert_dates,
    787     keep_default_dates=keep_default_dates,
    788     precise_float=precise_float,
    789     date_unit=date_unit,
    790     encoding=encoding,
    791     lines=lines,
    792     chunksize=chunksize,
    793     compression=compression,
    794     nrows=nrows,
    795     storage_options=storage_options,
    796     encoding_errors=encoding_errors,
...
File c:\ProgramData\anaconda3\Lib\urllib\request.py:643, in HTTPDefaultErrorHandler.http_error_default(self, req, fp, code, msg, hdrs)
    642 def http_error_default(self, req, fp, code, msg, hdrs):
--> 643     raise HTTPError(req.full_url, code, msg, hdrs, fp)

**HTTPError: HTTP Error 403: Forbidden
Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings**...**

Fui atrás e vi que é um erro de request até que relativamente simples de resolver. Resolvi com o seguinte código utilizando a biblioteca requests:

def carregar_json(url):
    response = requests.get(url)
    response.raise_for_status()  # Levanta um erro HTTP se a requisição falhar
    return response.json()

# Carregar os dados
dados_hospedagem_json = carregar_json(url_dados_hospedagem)

# Converter para DataFrame
dados_hospedagem = pd.DataFrame(dados_hospedagem_json)

Deu certo, porém, todas as URLs que estou lendo em formato JSON, preciso fazer todo esse processo novamente da declaração e usar a função a partir da biblioteca importada. Tanto nas duas bases de dados do início do curso, como nos dois primeiros desafios.

Como isso nunca ocorreu em outros cursos, gostaria de saber se tem como resolver isso para ler diretamente com a biblioteca pandas. Vocês poderiam me auxiliar, por favor?!

Obs.: Estou utilizando o kernel conda (Python 3.11.7)

1 resposta
solução!

Olá, Pedro! Tudo bem?

Infelizmente, o pd.read_json realmente não consegue lidar com todas as URLs diretamente. Pode ser devido a restrições de acesso ou outras configurações do servidor, dependendo do caso. Utilizar a biblioteca requests é uma boa forma de contornar essa situação, exatamente da forma como você fez - obtendo a resposta com get e, depois, transformando para dataframe.

O que fez isso acontecer não foi seu ambiente, já que é uma limitação da biblioteca, mesmo. Inclusive, testei no Colab e recebi o mesmo erro!

Se você estiver utilizando o Github para salvar o seu projeto do curso, pode baixar o arquivo json no seu repositório público e acessar diretamente pela versão raw. Assim, vai dar certinho ler pela url e não diretamente pelo arquivo local, como é feito no curso.

Espero ter ajudado, Pedro.

Abraços.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!