Poderiam me ajudar com este erro?
Ei, Guilherme! Tudo bem?
O código não conseguiu baixar o arquivo dados_2015.csv
, gerando o erro FileNotFoundError: [Errno 2] No such file or directory: 'data/dados_2015.csv'. Isso aconteceu porque o servidor da Prefeitura de Boston bloqueou a requisição feita pela função urllib.request.urlretrieve()
.
Servidores muitas vezes rejeitam requisições de scripts que não se identificam como navegadores. A função urlretrieve
não envia um cabeçalho "User-Agent"
, o que faz o servidor detectar a requisição como um bot e bloqueá-la.
Para conseguir baixar os arquivos recomendo que faça o seguinte:
import urllib.request
#Módulo utilizado para fazer o download de dados de uma url
# Função para baixar dados de um URL e salvar em um arquivo
def extract_data(url, filename): #Parâmetros da função que espera 2 argumentos
try:
urllib.request.urlretrieve(url, filename)
# Baixa o arquivo do URL e salva no local especificado
except Exception as e:
print(e) # Imprime qualquer erro que ocorra durante o processo
import requests
def extract_data(url, filename):
try:
headers = {'User-Agent': 'Mozilla/5.0'} # Simula um navegador
response = requests.get(url, headers=headers)
response.raise_for_status() # Gera erro se a resposta não for 200
with open(filename, 'wb') as f:
f.write(response.content) # Salva o conteúdo no arquivo
print(f"Arquivo salvo com sucesso: {filename}")
except Exception as e:
print(f"Erro ao baixar {filename}: {e}")
Sobre o que o código que trocamos faz: A função extract_data
recebe uma URL e o nome de um arquivo local. Ela envia uma requisição HTTP
à URL usando um cabeçalho User-Agent
para simular um navegador. Se a resposta for bem-sucedida (status 200), o conteúdo é salvo no arquivo especificado. Em caso de erros, como URL inválida ou erro 403, uma mensagem de erro é exibida. Assim, a função garante o download correto dos dados, evitando problema de "arquivo não encontrado" ao usar a biblioteca pandas.
Espero ter ajudado e qualquer dúvida, compartilhe no fórum.
Até mais e bons estudos!
Caso este post tenha lhe ajudado, por favor, marcar como solucionado!