Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

HTTPError: HTTP Error 403: Forbidden

Não consegui importar os dados do site: https://www.portalbrasil.net/igpm.htm

Fazendo a importação dos dados no formato html de um site:

df_html_ipgm = pd.read_html("https://www.portalbrasil.net/igpm.htm");

Erro:

HTTPError Traceback (most recent call last) in ----> 1 df_html_ipgm = pd.read_html("https://www.portalbrasil.net/igpm.htm");

~\Anaconda3\envs\alura_pandas\lib\site-packages\pandas\io\html.py in read_html(io, match, flavor, header, index_col, skiprows, attrs, parse_dates, tupleize_cols, thousands, encoding, decimal, converters, na_values, keep_default_na) 913 thousands=thousands, attrs=attrs, encoding=encoding, 914 decimal=decimal, converters=converters, na_values=na_values, --> 915 keep_default_na=keep_default_na)

~\Anaconda3\envs\alura_pandas\lib\site-packages\pandas\io\html.py in _parse(flavor, io, match, attrs, encoding, **kwargs) 747 break 748 else: --> 749 raise_with_traceback(retained) 750 751 ret = []

~\Anaconda3\envs\alura_pandas\lib\site-packages\pandas\compat_init_.py in raise_with_traceback(exc, traceback) 383 if traceback == Ellipsis: 384 _, _, traceback = sys.exc_info() --> 385 raise exc.with_traceback(traceback) 386 else: 387 # this version of raise is a syntax error in Python 3

HTTPError: HTTP Error 403: Forbidden

5 respostas
solução!

Olá Steve. A página está bloqueando o acesso porque você não está usando um navegador. Então você pode fingir ser um navegador. Para isso podemos usar a biblioteca requests.

import requests

#A url que você quer acesssar
url = "https://www.portalbrasil.net/igpm.htm"

#Informações para fingir ser um navegador
header = {
  "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36",
  "X-Requested-With": "XMLHttpRequest"
}
#juntamos tudo com a requests
r = requests.get(url, headers=header)
#E finalmente usamos a função read_html do pandas
dfs = pd.read_html(r.text)

A tabela foi importada, porém as casas decimais foram ignoradas. Onde era 0,01 foi importado como 001. Onde era 61,46 foi importado como 6146. Acredito que seja porque o Python usa "." (ponto) para separar as casas decimais e o site testado usa "," (vírgula). Realmente é este o motivo? Como corrigir?

Parece ser esse o problema sim. A solução seria dividir por os números da tabela por 100. Acho que este post ajuda neste assunto também.

Olá Steve,

Para facilitar a conversão dos dados como o Allan falou, você pode utilizar os parâmetros thousands e decimal do read_html:

dfs = pd.read_html(r.text, thousands='.', decimal=',')

Após isso você pode começar a organizar e converter os valores de cada DataFrame.

Perfeito!