Eu tenho um pequeno utilitário que eu uso para baixar um arquivo MP3 de um site em um cronograma e, em seguida, cria / atualiza um arquivo XML de podcast que eu adicionei ao iTunes.
O processamento de texto que cria / atualiza o arquivo XML é escrito em Python. No entanto, eu uso o wget dentro de um .bat
arquivo do Windows para baixar o arquivo MP3 real. Eu preferiria ter todo o utilitário escrito em Python.
Eu lutei para encontrar uma maneira de realmente fazer o download do arquivo em Python, e por isso comecei a usar wget
.
Então, como faço para baixar o arquivo usando Python?
wget
. Entre outras coisas,wget
(1) preserva os carimbos de data / hora (2) determina automaticamente o nome do arquivo do URL, acrescentando.1
(etc.) se o arquivo já existe (3) tem muitas outras opções, algumas das quais você pode ter colocado no seu.wgetrc
. Se você quiser alguma dessas, precisará implementá-las pessoalmente em Python, mas é mais simples invocar awget
partir do Python.import urllib.request; s = urllib.request.urlopen('http://example.com/').read().decode()
Respostas:
No Python 2, use urllib2, que vem com a biblioteca padrão.
Essa é a maneira mais básica de usar a biblioteca, menos qualquer manipulação de erro. Você também pode fazer coisas mais complexas, como alterar cabeçalhos. A documentação pode ser encontrada aqui.
fonte
urllib2.quote
Mais um, usando
urlretrieve
:(para uso em Python 3+
import urllib.request
eurllib.request.urlretrieve
)Mais um, com uma "barra de progresso"
fonte
if not os.path.isfile(file_name):
para evitar a substituição de podcasts! útil quando executá-lo como um cron com as URLs encontrados em um arquivo .htmlEm 2012, use a biblioteca de solicitações python
Você pode correr
pip install requests
para obtê-lo.Os pedidos têm muitas vantagens sobre as alternativas, porque a API é muito mais simples. Isto é especialmente verdade se você precisar fazer autenticação. urllib e urllib2 são bastante pouco intuitivos e dolorosos nesse caso.
30-12-2015
As pessoas expressaram admiração pela barra de progresso. É legal, com certeza. Agora existem várias soluções prontas para uso, incluindo
tqdm
:Essa é essencialmente a implementação @kvance descrita há 30 meses.
fonte
r.text
Para conteúdo de texto ou unicode. Retornado como unicode.r.content
: Para conteúdo binário. Retornado como bytes. Leia sobre isso aqui: docs.python-requests.org/en/latest/user/quickstartO
wb
inopen('test.mp3','wb')
abre um arquivo (e apaga qualquer arquivo existente) no modo binário, para que você possa salvar dados com ele em vez de apenas texto.fonte
file.read
esse é o número de bytes a serem lidos. Veja: gist.github.com/hughdbrown/c145b8385a2afa6570e2shutil.copyfileobj(mp3file, output)
vez disso.Python 3
urllib.request.urlopen
urllib.request.urlretrieve
Nota: De acordo com a documentação,
urllib.request.urlretrieve
é uma "interface herdada" e "pode ficar obsoleta no futuro" (obrigado gerrit )Python 2
urllib2.urlopen
(obrigado Corey )urllib.urlretrieve
(obrigado PabloG )fonte
urllib.request.urlretrieve
acima, ele o levará ao link exato. Felicidades!urllib.request.urlretrieve
está documentado como uma "interface herdada" e "pode ficar obsoleto no futuro".use o módulo wget:
fonte
Uma versão aprimorada do código PabloG para Python 2/3:
fonte
A
Python 2 & Python 3
maneira simples, porém compatível, vem com asix
biblioteca:fonte
fonte
Escreveu a biblioteca wget em Python puro apenas para esse fim. É aprimorado
urlretrieve
com esses recursos a partir da versão 2.0.fonte
-o
para-O
para evitar confusão, como no GNU wget. Ou pelo menos as duas opções devem ser válidas.wget.py
uma substituição no local de verdadewget
. O-o
já se comporta de maneira diferente - é compatível comcurl
esse caminho. Uma observação na documentação ajudaria a resolver o problema? Ou é o recurso essencial para que um utilitário com esse nome seja compatível com a linha de comando?A seguir, são apresentadas as chamadas mais usadas para baixar arquivos em python:
urllib.urlretrieve ('url_to_file', file_name)
urllib2.urlopen('url_to_file')
requests.get(url)
wget.download('url', file_name)
Nota:
urlopen
eurlretrieve
são encontrados para desempenho relativamente ruim com o download de arquivos grandes (tamanho> 500 MB).requests.get
armazena o arquivo na memória até que o download seja concluído.fonte
Eu concordo com Corey, urllib2 é mais completo do que urllib e provavelmente deve ser o módulo usado se você quiser fazer coisas mais complexas, mas para tornar as respostas mais completas, urllib é um módulo mais simples se você quiser apenas o básico:
Vai funcionar bem. Ou, se você não quiser lidar com o objeto "response", pode chamar read () diretamente:
fonte
No python3, você pode usar urllib3 e shutil libraires. Faça o download deles usando pip ou pip3 (Dependendo se python3 é o padrão ou não)
Em seguida, execute este código
Observe que você baixa,
urllib3
mas usaurllib
no códigofonte
Você também pode obter o feedback de progresso com urlretrieve:
fonte
Se você tiver o wget instalado, poderá usar o parallel_sync.
instalação do pip parallel_sync
Doc: https://pythonhosted.org/parallel_sync/pages/examples.html
Isso é bem poderoso. Ele pode baixar arquivos em paralelo, tentar novamente em caso de falha e até baixar arquivos em uma máquina remota.
fonte
Se a velocidade é importante para você, fiz um pequeno teste de desempenho para os módulos
urllib
ewget
, sobrewget
isso, tentei uma vez com barra de status e outra sem. Peguei três arquivos diferentes de 500 MB para testar (arquivos diferentes - para eliminar a chance de que haja algum armazenamento em cache oculto). Testado na máquina debian, com python2.Primeiro, estes são os resultados (eles são semelhantes em execuções diferentes):
A maneira como realizei o teste está usando o decorador "profile". Este é o código completo:
urllib
parece ser o mais rápidofonte
Por uma questão de integridade, também é possível chamar qualquer programa para recuperar arquivos usando o
subprocess
pacote. Programas dedicados à recuperação de arquivos são mais poderosos do que as funções do Pythonurlretrieve
. Por exemplo, vocêwget
pode baixar diretórios recursivamente (-R
), pode lidar com FTP, redireciona, proxies HTTP, pode evitar o download de arquivos existentes (-nc
) earia2
pode fazer downloads com várias conexões, o que potencialmente pode acelerar seus downloads.No Jupyter Notebook, também é possível chamar programas diretamente com a
!
sintaxe:fonte
O código fonte pode ser:
fonte
Você pode usar o PycURL no Python 2 e 3.
fonte
Eu escrevi o seguinte, que funciona em baunilha Python 2 ou Python 3.
Notas:
fonte
Pode ser um pouco tarde, mas eu vi o código de pabloG e não pude deixar de adicionar um os.system ('cls') para torná-lo IMPRESSIONANTE! Confira :
Se estiver executando em um ambiente que não seja o Windows, você precisará usar algo diferente de 'cls'. No MAC OS X e Linux, deve ser "claro".
fonte
cls
não faz nada no meu OS X ou nem em um servidor Ubuntu meu. Alguns esclarecimentos podem ser bons.clear
para linux, ou melhor ainda, substituir a linha de impressão em vez de limpar toda a saída da linha de comando.os.system()
) que inicia um subprocesso para limpar a tela usando um comando específico da plataforma (cls
). Como é que isto tem qualquer upvotes ?? Absolutamente inútil "resposta" IMHO.urlretrieve e orders.get são simples, porém a realidade não. Busquei dados para sites de casal, incluindo texto e imagens, os dois acima provavelmente resolvem a maioria das tarefas. mas para uma solução mais universal, sugiro o uso de urlopen. Como está incluído na biblioteca padrão do Python 3, seu código pode ser executado em qualquer máquina que execute o Python 3 sem pré-instalar o pacote do site
Esta resposta fornece uma solução para o HTTP 403 Proibido ao baixar arquivos por HTTP usando Python. Eu tentei apenas solicitações e módulos urllib, o outro módulo pode oferecer algo melhor, mas esse é o que eu usei para resolver a maioria dos problemas.
fonte
Resposta tardia, mas para
python>=3.6
você poder usar:Instale
dload
com:fonte
Eu queria baixar todos os arquivos de uma página da web. Eu tentei,
wget
mas estava falhando, então decidi pela rota Python e encontrei esse segmento.Depois de ler, fiz um pequeno aplicativo de linha de comando
soupget
, expandindo as excelentes respostas de PabloG e Stan e adicionando algumas opções úteis.Ele usa o BeatifulSoup para coletar todos os URLs da página e depois baixar os com as extensões desejadas. Finalmente, ele pode baixar vários arquivos em paralelo.
Aqui está:
Um exemplo de seu uso é:
E um exemplo real, se você quiser vê-lo em ação:
fonte