848 votos

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

Tengo una pequeña utilidad que uso para descargar un MP3 de un sitio web en un horario y luego construye/actualiza un archivo XML de podcast que obviamente he añadido a iTunes.

El procesamiento de texto que crea/actualiza el archivo XML está escrito en Python. Sin embargo, uso wget dentro de un archivo .bat de Windows para descargar el MP3 real. Sin embargo, preferiría tener toda la utilidad escrita en Python. (Fue el proyecto que usé para empezar a aprender Python).

Sin embargo, me costó encontrar una forma de descargar el archivo en Python, por lo que recurrí a wget.

Entonces, ¿cómo puedo descargar el archivo usando Python?

1090voto

PabloG Puntos 9308

Una más, utilizando urlretrieve :

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

Otro más, con una "barra de progreso"

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()

442voto

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, sin ningún tipo de manejo de errores. También puedes hacer cosas más complejas como cambiar las cabeceras. La documentación se puede encontrar aquí.

334voto

hughdbrown Puntos 15770

En 2012, utilice el Biblioteca de peticiones de Python

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

Puede ejecutar pip install requests para conseguirlo.

Requests tiene muchas ventajas sobre las alternativas porque la API es mucho más sencilla. Esto es especialmente cierto si tienes que hacer la autenticación. urllib y urllib2 son bastante poco intuitivos y dolorosos en este caso.

158voto

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 open('test.mp3','wb') abre un archivo (y borra cualquier existente), binaralmente, para que puedas guardar datos con él, en lugar de sólo texto.

14voto

akdom Puntos 6724

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

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

Funcionará bien. O, si no quieres lidiar con el objeto "respuesta" puedes llamar a leer() 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:

X