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: 3.8 (44 votes)

Comentários

imagem de bardo
Enviado por bardo em 18. Fevereiro 2017 - 9:56

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
Enviado por Reinaldo (não verificado) em 13. Setembro 2017 - 22:41

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
Enviado por bardo em 16. Setembro 2017 - 7:59

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. :-)

imagem de michel melo
Enviado por michel melo (não verificado) em 21. Setembro 2018 - 15:15

Olá, gostei muito do post, consegui fazer alguns poucos ajustes e fazer os dowloads que eu queria. Muito obrigado, foi de grande ajuda. =D

imagem de bardo
Enviado por bardo em 4. Julho 2019 - 11:14

Salve! Cara, realmente não faço ideia. Mesmo porque a ideia de um captcha é justamente evitar que programas acessem conteúdos que era pra serem acessados apenas por humanos...

imagem de António José
Enviado por António José (não verificado) em 26. Fevereiro 2020 - 18:49

imagem de THIAGO CAJAZEIRA
Enviado por THIAGO CAJAZEIRA (não verificado) em 31. Março 2020 - 14:49

Ola, preciso da ajuda do amigo.

Sou contador e curioso nessa área de programação e gostaria de entender melhor como faço procedimento parecido para baixar uma sequencia de xmls (por periodo) e (por empresa) de um site emisspor de nota fiscal eletronica de serviços. lembrando que o site exige login e senha uma unica vez, sem capcha.

muito obigado e parabens pela iniciativa

abraço

imagem de Renato
Enviado por Renato (não verificado) em 29. Setembro 2020 - 11:03

Prezados,

 

Estou implementando um download do arquivo portal da transparência, porém o arquivo possui aprox. 1GB.

Quando mando fazer o download ele dá status 200, e informa que fez o download do arquivo, porém baixa apenas 178kb.

Saberia me informar o motivo?

 

Abraço

 

 

def download_arquivo_portal_transp_br(url_arquivo):
    url = "https://zxxxxxxx.zip"
    r = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})
    print(r.status_code)
    with open("down_load.zip", "wb") as code:
        code.write(r.content) #        shutil.copyfileobj(response, out_file)
    print("Download finalizado.")

Comentar


Warning: PHP Startup: Unable to load dynamic library '/opt/php56/lib/php/extensions/no-debug-non-zts-20131226/pdo.so' - /opt/php56/lib/php/extensions/no-debug-non-zts-20131226/pdo.so: cannot open shared object file: No such file or directory in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library '/opt/php56/lib/php/extensions/no-debug-non-zts-20131226/pdo_mysql.so' - /opt/php56/lib/php/extensions/no-debug-non-zts-20131226/pdo_mysql.so: cannot open shared object file: No such file or directory in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library '/opt/php56/lib/php/extensions/no-debug-non-zts-20131226/php_pdo_odbc.dll' - /opt/php56/lib/php/extensions/no-debug-non-zts-20131226/php_pdo_odbc.dll: cannot open shared object file: No such file or directory in Unknown on line 0