Falta pouco!

0 dias

0 horas

0 min

0 seg

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

[Sugestão] HTTPError: HTTP Error 403: Forbidden com páginas da Wikipédia

Olá, pessoal!

Recentemente, tentei carregar a página da Wikipédia com a lista de países por população usando:

import pandas as pd

paises_populacao_html = pd.read_html('https://pt.wikipedia.org/wiki/Lista_de_pa%C3%ADses_por_popula%C3%A7%C3%A3o')

E recebi o erro:

HTTPError: HTTP Error 403: Forbidden

Pesquisando descobri devido ao servidor bloquear requisições que não parecem vir de um navegador. Ou seja, o pandas não envia um User-Agent por padrão, e o site interpreta a requisição como suspeita.

Para contornar, existem duas estratégias:

Salvar a página e usar um link raw (como do GitHub):

paises_populacao_html = pd.read_html('https://raw.githubusercontent.com/YuriArduino/Estudos_Pandas/refs/heads/data-tests/Lista%20de%20pa%C3%ADses%20por%20popula%C3%A7%C3%A3o%20%E2%80%93%20Wikip%C3%A9dia.html')

Ou

Simular um navegador adicionando um User-Agent com requests:

import requests

url = "https://pt.wikipedia.org/wiki/Lista_de_pa%C3%ADses_por_popula%C3%A7%C3%A3o"
headers = {"User-Agent": "Mozilla/5.0"}
response = requests.get(url, headers=headers)

paises_populacao_html = pd.read_html(response.text)

Com essa segunda abordagem, o servidor entende que a requisição vem de um navegador real, e você consegue ler a tabela sem precisar salvar o HTML.

Espero que essa dica ajude quem encontrou o mesmo erro!

3 respostas
solução!

Ei, Yuri! Tudo bem?

Muito obrigada por compartilhar todo esse processo de erro e resolução, com certeza ajudará muitos(as) colegas da comunidade.

É muito legal te ver ativo, praticando as atividades. Continue nesse ritmo que você está se saindo muito bem!

E qualquer dúvida, compartilhe no fórum, estaremos por aqui.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Oi, Nathalia! Tudo ótimo, obrigado pela mensagem!
Fico feliz em poder compartilhar e ajudar outros colegas da comunidade.

Vou continuar praticando e postando minhas dúvidas e soluções.

Olá! Segui sua dica, mas ainda assim recebi um aviso de que o código poderia não funcionar no futuro. Recorri ao ChatGPT e ele me deu a seguinte dica:

import requests
import pandas as pd
from io import StringIO # 1. Importa a classe StringIO

url = "https://pt.wikipedia.org/wiki/Lista_de_pa%C3%ADses_por_popula%C3%A7%C3%A3o"
headers = {"User-Agent": "Mozilla/5.0"}
response = requests.get(url, headers=headers)

2. Passa o conteúdo HTML dentro de um objeto StringIO

paises_populacao_html = pd.read_html(StringIO(response.text))

Agora seu código está correto e não mostrará o aviso

print("Código executado com sucesso e sem avisos!")
paises_populacao_html[0]