390 votos

¿Cómo puedo descargar un archivo a través de HTTP usando Python?

Tengo una pequeña utilidad que uso para descargar un MP3 de una página web en un documento y, a continuación, construye/actualizaciones de podcast archivo XML que he obviamente añadido a iTunes.

El procesamiento de texto que crea/actualiza el archivo XML está escrito en Python. Puedo utilizar wget en el interior de un .bat de Windows el archivo para descargar el real MP3 sin embargo. Yo prefiero tener toda la utilidad escrito en Python, aunque. (Fue el proyecto que utiliza para empezar a aprender Python.)

Luché a pesar de que encontrar una manera de cargar el archivo en Python, así que ¿por qué he recurrido a wget.

Así que, ¿cómo puedo descargar el archivo usando Python?

665voto

PabloG Puntos 9308

Uno más, usando urlretrieve :

 import urllib
urllib.urlretrieve ("http://www.example.com/songs/mp3.mp3", "mp3.mp3")
 

Sin embargo, otro uno, con una "progressbar"

 import urllib2

url = "http://download.thinkbroadband.com/10MB.zip"

file_name = url.split('/')[-1]
u = urllib2.urlopen(url)
f = open(file_name, 'wb')
meta = u.info()
file_size = int(meta.getheaders("Content-Length")[0])
print "Downloading: %s Bytes: %s" % (file_name, file_size)

file_size_dl = 0
block_sz = 8192
while True:
    buffer = u.read(block_sz)
    if not buffer:
        break

    file_size_dl += len(buffer)
    f.write(buffer)
    status = r"%10d  [%3.2f%%]" % (file_size_dl, file_size_dl * 100. / file_size)
    status = status + chr(8)*(len(status)+1)
    print status,

f.close()
 

244voto

Corey Puntos 5286

En Python 2, utilice urllib2 que viene con la biblioteca estándar.

 import urllib2
response = urllib2.urlopen('http://www.example.com/')
html = response.read()
 

Esta es la forma más básica de utilizar la biblioteca, menos cualquier tratamiento de errores. También puede hacer cosas más complejas, tales como cambiar los encabezados. La documentación se puede encontrar aquí.

186voto

hughdbrown Puntos 15770

En 2012, utilice la biblioteca peticiones python

 >>> import requests
>>> 
>>> url = "http://download.thinkbroadband.com/10MB.zip"
>>> r = requests.get(url)
>>> print len(r.content)
10485760
 

Puede ejecutar pip install requests conseguirlo.

Pide tiene muchas ventajas sobre las alternativas porque la API es mucho más simple. Esto es especialmente cierto si usted tiene que hacer la autenticación. urllib y urllib2 son bastante poco intuitivo y doloroso en este caso.

106voto

Grant Puntos 5366
 import urllib2
mp3file = urllib2.urlopen("http://www.example.com/songs/mp3.mp3")
output = open('test.mp3','wb')
output.write(mp3file.read())
output.close()
 

el 'wb' en abierto ('test.mp3', 'wb') abre una (y borra cualquier existente) archivo, binaraly, por lo que puede guardar los datos con él, en vez de texto.

9voto

akdom Puntos 6724

Estoy de acuerdo con Corey, urllib2 es más completa que urllib y probablemente debería ser el módulo utilizado si usted quiere hacer las cosas más complejas, pero para que las respuestas más completas, urllib es un módulo simple si desea sólo lo básico:

 import urllib
response = urllib.urlopen('http://www.example.com/sound.mp3')
mp3 = response.read()
 

No tendrán ningún problema. O, si usted no quiere hacer frente a la "respuesta" objeto puede llamar a read () directamente:

 import urllib
mp3 = urllib.urlopen('http://www.example.com/sound.mp3').read()
 

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: