Precisa baixar arquivos de um endereço web utilizando Python? Vamos explorar diversas formas de realizar essa tarefa.
Durante o desenvolvimento de um projeto em Python, surge frequentemente a necessidade de obter arquivos da internet, a partir de uma URL específica.
Embora seja possível fazer o download manualmente através do navegador, a opção de baixar esses arquivos programaticamente, usando um script Python, oferece muito mais conveniência e automação.
Neste guia, examinaremos várias abordagens para baixar arquivos da web com Python, utilizando tanto bibliotecas nativas do Python quanto pacotes de terceiros.
Como usar Python para baixar arquivos de URLs
Se você já tem experiência com Python, talvez se recorde da famosa tirinha XKCD sobre Python:
Tirinha sobre Python | Fonte: XKCD
Como exemplo prático, vamos tentar baixar esta imagem PNG da tirinha XKCD (arquivo .png) para o nosso diretório de trabalho, utilizando diferentes métodos.
Ao longo deste tutorial, utilizaremos diversos pacotes Python de terceiros. Recomenda-se instalá-los em um ambiente virtual dedicado ao seu projeto.
Utilizando urllib.request
É possível usar o módulo integrado do Python, urllib.request, para baixar arquivos a partir de uma URL. Este módulo oferece funcionalidades para fazer requisições HTTP e lidar com URLs, sendo uma forma simples de interagir com recursos da web e realizar tarefas como a busca de dados em websites.
Vamos baixar a tirinha XKCD Python utilizando o urllib.request:
import urllib.request url="https://imgs.xkcd.com/comics/python.png" urllib.request.urlretrieve(url, 'xkcd_comic.png')
Neste código, realizamos o seguinte:
- Importamos o módulo urllib.request.
- Definimos a URL da imagem da tirinha XKCD Python.
- Utilizamos a função urllib.request.urlretrieve para baixar a imagem e salvá-la com o nome ‘xkcd_comic.png’ no diretório atual.
Ao executar o comando ‘ls’ no terminal para verificar o conteúdo do diretório, você verá o arquivo ‘xkcd_comic.png’:
Usando a Biblioteca Requests
A biblioteca Requests é um pacote Python muito popular e amplamente utilizado para fazer solicitações HTTP na web e obter conteúdos.
Primeiro, instale a biblioteca Requests:
pip install requests
Se você criou um novo script Python na mesma pasta, apague o arquivo ‘xkcd_comic.png’ antes de executar o script a seguir.
import requests url="https://imgs.xkcd.com/comics/python.png" response = requests.get(url) with open('xkcd_comic.png', 'wb') as file: file.write(response.content)
Vamos analisar o que fizemos nesta abordagem:
- Importamos a biblioteca Requests.
- Definimos a URL da imagem da tirinha XKCD Python.
- Enviamos uma requisição GET para a URL, utilizando requests.get.
- Salvamos o conteúdo da resposta (os dados da imagem) como ‘xkcd_comic.png’ em modo de escrita binária.
O resultado será o download da imagem, como pode ser visto ao verificar o conteúdo do diretório:
Utilizando urllib3
Já vimos como utilizar o módulo urllib.request. No entanto, você também pode usar o pacote de terceiros urllib3.
Urllib3 é uma biblioteca Python para fazer solicitações HTTP e gerenciar conexões de forma mais confiável e eficaz do que o módulo urllib integrado. Ele oferece recursos como pooling de conexões, tentativas de repetição de solicitações e segurança de thread, tornando-o uma escolha robusta para lidar com comunicação HTTP em aplicações Python.
Instale urllib3 através do pip:
pip install urllib3
Agora, vamos baixar a tirinha XKCD Python usando a biblioteca urllib3:
import urllib3 # URL da imagem da tirinha XKCD url="https://imgs.xkcd.com/comics/python.png" # Cria uma instância PoolManager http = urllib3.PoolManager() # Envia uma requisição HTTP GET para a URL response = http.request('GET', url) # Obtém o conteúdo (dados da imagem) image_data = response.data # Define o nome do arquivo para salvar a tirinha file_name="xkcd_comic.png" # Salva os dados da imagem with open(file_name, 'wb') as file: file.write(image_data)
Esta abordagem parece um pouco mais complexa do que as anteriores com urllib.request e a biblioteca Requests. Vamos detalhar cada etapa:
- Iniciamos importando o módulo urllib3, que fornece a funcionalidade para fazer requisições HTTP.
- Em seguida, especificamos a URL da imagem da tirinha XKCD.
- Criamos uma instância de urllib3.PoolManager(). Este objeto administra o pool de conexões e nos permite fazer requisições HTTP.
- Utilizamos o método http.request(‘GET’, url) para enviar uma solicitação HTTP GET para a URL definida. Esta solicitação obtém o conteúdo da tirinha XKCD.
- Assim que a solicitação é bem-sucedida, recuperamos o conteúdo (dados da imagem) da resposta HTTP usando response.data.
- Por fim, gravamos os dados da imagem (obtidos da resposta) no arquivo.
Ao executar o script Python, você verá uma saída semelhante a esta:
Usando wget
A biblioteca wget para Python facilita o download de arquivos de URLs. Você pode usá-la para obter recursos da web, sendo especialmente útil para automatizar tarefas de download.
Instale a biblioteca wget usando pip e utilize as suas funções para baixar arquivos de URLs:
pip install wget
Este trecho usa o módulo wget para baixar a tirinha XKCD Python e salvá-la como ‘xkcd_comic.png’ no diretório de trabalho:
import wget url="https://imgs.xkcd.com/comics/python.png" wget.download(url, 'xkcd_comic.png')
Aqui:
- Importamos o módulo wget.
- Definimos a URL da imagem da tirinha XKCD Python.
- Utilizamos wget.download para baixar a imagem e salvá-la como ‘xkcd_comic.png’ na pasta atual.
Ao baixar a tirinha XKCD utilizando wget, você verá um resultado parecido com este:
Usando PyCURL
Se você já utilizou um sistema Linux ou Mac, talvez conheça a ferramenta de linha de comando cURL para baixar arquivos da web.
PyCURL, uma interface Python para libcurl, é uma ferramenta poderosa para fazer requisições HTTP. Ela oferece controle detalhado sobre as solicitações e pode ser usada em casos de uso avançados para lidar com recursos da web.
A instalação do pycurl no seu ambiente de trabalho pode ser complexa. Experimente instalar usando pip:
pip install pycurl
Se ocorrerem erros durante o processo, consulte o Guia de instalação do PyCURL para dicas de resolução de problemas.
Uma alternativa, se você tiver o cURL instalado, é instalar as ligações Python para libcurl da seguinte forma:
sudo apt install python3-pycurl
Observação: Antes de instalar a ligação Python, você precisa ter o cURL instalado. Se você não tem o cURL na sua máquina, pode instalá-lo com o comando: apt install curl.
Baixando arquivos com PyCURL
Aqui está o código para baixar a tirinha XKCD usando PyCURL:
import pycurl from io import BytesIO # URL da tirinha XKCD Python url="https://imgs.xkcd.com/comics/python.png" # Cria um objeto Curl c = pycurl.Curl() # Define a URL c.setopt(pycurl.URL, url) # Cria um objeto BytesIO para armazenar os dados baixados buffer = BytesIO() c.setopt(pycurl.WRITEDATA, buffer) # Executa a requisição c.perform() # Verifica se a requisição foi bem-sucedida (código de status HTTP 200) http_code = c.getinfo(pycurl.HTTP_CODE) if http_code == 200: # Salva os dados baixados em um arquivo with open('xkcd_comic.png', 'wb') as f: f.write(buffer.getvalue()) # Fecha o objeto Curl c.close()
Vamos dividir este código em partes menores para facilitar a compreensão de cada etapa:
Etapa 1: Importar os módulos necessários
Primeiro, importamos o pycurl, para que possamos utilizá-lo para fazer requisições HTTP. Em seguida, importamos BytesIO do módulo io para criar um buffer para armazenar os dados baixados:
import pycurl from io import BytesIO
Etapa 2: Criar um objeto Curl e definir a URL
Especificamos a URL da tirinha XKCD Python que queremos baixar e criamos um objeto curl, que representa a requisição HTTP. Em seguida, definimos a URL para o objeto Curl usando c.setopt(pycurl.URL, url):
# URL da tirinha XKCD Python url="https://imgs.xkcd.com/comics/python.png" # Cria um objeto Curl c = pycurl.Curl() # Define a URL c.setopt(pycurl.URL, url)
Etapa 3: Criar um objeto BytesIO e definir a opção WRITEDATA
Criamos um objeto BytesIO para armazenar os dados baixados e configuramos o objeto Curl para gravar os dados da resposta no nosso buffer usando c.setopt(pycurl.WRITEDATA, buffer):
# Cria um objeto BytesIO para armazenar os dados baixados buffer = BytesIO() c.setopt(pycurl.WRITEDATA, buffer)
Etapa 4: Executar a requisição
Executamos a requisição HTTP utilizando c.perform() e recuperamos os dados da imagem da tirinha:
# Executa a requisição c.perform()
Etapa 5: Verificar o código de status HTTP e salvar os dados baixados
Obtemos o código de status HTTP através de c.getinfo(pycurl.HTTP_CODE) para garantir que a requisição foi bem-sucedida (código HTTP 200). Se o código de status HTTP for 200, escrevemos os dados do buffer no arquivo de imagem:
# Verifica se a requisição foi bem-sucedida (código de status HTTP 200) http_code = c.getinfo(pycurl.HTTP_CODE) if http_code == 200: # Salva os dados baixados em um arquivo with open('xkcd_comic.png', 'wb') as f: f.write(buffer.getvalue())
Etapa 6: Fechar o objeto Curl
Por fim, fechamos o objeto curl utilizando c.close() para liberar os recursos:
# Fecha o objeto Curl c.close()
Como baixar arquivos grandes em partes menores
Até agora, vimos diversas formas de baixar a tirinha XKCD Python – um arquivo de imagem pequeno – para o diretório atual.
No entanto, também é possível baixar arquivos muito maiores, como instaladores de IDEs e outros. Ao baixar arquivos tão grandes, é útil fazer o download em partes menores e acompanhar o progresso do download. Podemos usar as funcionalidades da biblioteca Requests para isso.
Vamos utilizar o Requests para baixar o instalador do VS Code em partes de 1MB:
import requests # URL do arquivo EXE do instalador do Visual Studio Code url="https://code.visualstudio.com/sha/download?build=stable&os=win32-x64-user" # Tamanho do pedaço para download chunk_size = 1024 * 1024 # pedaços de 1 MB response = requests.get(url, stream=True) # Determina o tamanho total do arquivo a partir do header Content-Length total_size = int(response.headers.get('content-length', 0)) with open('vs_code_installer.exe', 'wb') as file: for chunk in response.iter_content(chunk_size): if chunk: file.write(chunk) file_size = file.tell() # Obtém o tamanho atual do arquivo print(f'Downloading... {file_size}/{total_size} bytes', end='\r') print('Download completo.')
Neste código:
- Definimos `chunk_size` para determinar o tamanho de cada pedaço (1MB neste exemplo).
- Usamos requests.get com stream=True para transmitir o conteúdo da resposta sem carregar todo o arquivo na memória de uma vez.
- Salvamos cada pedaço no arquivo sequencialmente à medida que é baixado.
Conforme o download avança, você verá o número de bytes já baixados e o número total de bytes:
Após a conclusão do download, você verá a mensagem ‘Download completo’:
E você deverá ver o instalador do VS Code no seu diretório:
Conclusão
Espero que você tenha aprendido diferentes maneiras de baixar arquivos de URLs usando Python. Além do módulo urllib.request integrado, exploramos pacotes Python populares de terceiros, como Requests, urllib3, wget e PyCURL.
Como desenvolvedor, utilizei a biblioteca Requests com mais frequência do que outras em meus projetos para baixar arquivos e interagir com APIs da web de forma geral. No entanto, os outros métodos também podem ser úteis dependendo da complexidade da tarefa de download e do nível de controle necessário sobre as requisições HTTP. Boas descargas!