Como baixar um arquivo com Python

Se você não tem nada a ver com programação, nem tem interesse no assunto, simplesmente ignore este artigo.


Mike Driscoll tem um blog dedicado a Python chamado The Mouse vs. the Python e eventualmente há excelentes artigos por lá.

Esta é uma tradução livre do artigo Python 101: How to Download a File e modifiquei sutilmente algumas coisas, incluindo os exemplos.


Baixar arquivos da internet é o tipo de coisa que a maioria dos programadores, mais cedo ou mais tarde, vai terminar tendo que fazer. Python oferece várias formas de fazer exatamente isso, usando a biblioteca padrão. Provavelmente a forma mais popular de baixar um arquivo é sobre HTTP, usando o módulo urllib ou urllib2. Python também vem com ftplib para downloads via FTP. Para concluir, há um módulo de terceiros chamado requests que tem causando alvoroço (e está disponível no repositório padrão do Trisquel - e do Ubuntu - no pacote python-requests). Neste artigo, focaremos os módulos urllib e request.

Uma vez que se trata de uma tarefa bastante simples, mostraremos apenas um script rápido e sapecado, que baixa o mesmo arquivo com cada um dos módulos e nomeia o resultado de maneira levemente diferente. Baixaremos um arquivo PDF do cordel Fantasma d Opera, daqui do Bardo WS mesmo, para usar no nosso exemplo. Vamos dar uma sacada

# Python 2 code
import urllib
import urllib2
import requests
 
url = 'http://www.carlissongaldino.com.br/modules/pubdlcnt/pubdlcnt.php?file=http://www.carlissongaldino.com.br/sites/default/files/o-fantasma-da-opera.pdf&nid=1287'
 
print "baixando com urllib"
urllib.urlretrieve(url, "o-fantasma-da-opera-u.pdf")
 
print "baixando com urllib2"
f = urllib2.urlopen(url)
data = f.read()
with open("o-fantasma-da-opera-u2.pdf", "wb") as code:
    code.write(data)
 
print "baixando com requests"
r = requests.get(url)
with open("o-fantasma-da-opera-r.pdf", "wb") as code:
    code.write(r.content)

Como você pode ver, urllib precisa de apenas uma linha. Essa simplicidade o torna muito fácil de usar. Por outro lado, as outras duas bibliotecas também são muito simples. Para urllib2, você precisa apenas abrir a url, lê-la e escrever seus dados. Na verdade, você pode siplificar ainda mais esse script - em uma linha - fazendo o seguinte:

f = urllib2.urlopen(url)
with open("o-fantasma-da-opera-u2.pdf", "wb") as code:
    code.write(f.read())

De um jeito ou de outro, o código funciona muito bem. O método para o módulo requests é get, que corresponde ao HTTP GET. Você então pega o objeto requests e chama a propriedade content para escrever os dados onde você quiser. Nós optamos pelo statement with por ele fechar automaticamente o arquivo e simplificar o código. Note que usando siplesmente o "read()" pode ser perigoso, se o arquivo for muito grande. É melhor lê-lo aos poucos, passando um tamanho ao read.

Atualizado (8 de junho de 1012)

Como apontado por um dos leitores do The Mouse vs. The Python, o uso da urllib muda consideravelmente quando a utilizamos através do 2to3.py, no formato do Python 3. Assim, para complementar, aqui está como o código se parece:

# Python 3 code
import urllib.request, urllib.parse, urllib.error
 
url = 'http://www.carlissongaldino.com.br/modules/pubdlcnt/pubdlcnt.php?file=http://www.carlissongaldino.com.br/sites/default/files/o-fantasma-da-opera.pdf&nid=1287'
 
print("baixando com urllib")
urllib.request.urlretrieve(url, "o-fantasma-da-opera-u.pdf")
 
print("baixando com urllib2")
f = urllib.request.urlopen(url)
data = f.read()
with open("o-fantasma-da-opera-u2.pdf", "wb") as code:
    code.write(data)

Você nottará que urllib2 não existe mais e que urllib.urlretrieve e urllib2.urlopen mudou para urllib.request.urlretrieve e urllib.request.urlopen, respectivamente. O resto continua o mesmo, de modo que eu removi as outras partes.

Então está feito! Agora você pode baixar arquivos programando em Python 2 ou 3!

P. S.: Imagem do post: Python vert / Morelia Viridis, de raym5

Special: 
Avalie: 
Average: 4.2 (13 votes)

Comentários

imagem de Alison

Obrigado me ajudou muito

imagem de bardo

Fico feliz que tenha sido útil! :-) Nunca mais traduzi nada do mouse X python. Se seu inglês der conta, recomendo que passeie por lá porque tem muita coisa boa.

[]s

imagem de Reinaldo

Olá
Obrigado!

Este site tem vários links que abrem PDFs, nos locais de "Inteiro teor": http://www.camara.gov.br/proposicoesWeb/prop_emendas?idProposicao=212207...

Em Python 3 eu escrevi esse código para tentar fazer o download de um link:

import urllib.request, urllib.parse, urllib.error
url = "http://www.camara.gov.br/proposicoesWeb/prop_emendas?idProposicao=212207..."
urllib.request.urlretrieve(url, "EMC 1-2017 PL678716 =- PL 6787-2016.pdf")

Baixou um arquivo PDF, mas não abre no Acrobat: não pôde abrir o arquivo porque não há suporte a esse tipo de arquivo ou ele foi danificado

Por favor, sabe como fazer o download correto?
Abraços
Reinaldo Chaves

imagem de bardo

Você separou o endereço do pdf do restante da URL. A URL tem que estar completa, apontando para o link do PDF. O segundo parâmetro de urlretrieve é o nome que você pretende dar localmente ao arquivo.

Acredito que tenha sido só isso o problema. :-)

Comentar