Descargar archivos con Python

La descarga de archivos de diferentes recursos en línea es una de las tareas de programación más importantes y comunes para realizar en la web. La importancia de descargar archivos...

La descarga de archivos de diferentes recursos en línea es una de las tareas de programación más importantes y comunes para realizar en la web. La importancia de la descarga de archivos se puede resaltar por el hecho de que una gran cantidad de aplicaciones exitosas permiten a los usuarios descargar archivos. Estas son solo algunas de las funciones de la aplicación web que requieren la descarga de archivos:

  • Compartición de archivos
  • Procesamiento de datos
  • Recuperación del código del sitio web (CSS, JS, etc.)
  • Redes sociales

Estas son solo algunas de las aplicaciones que se te ocurren, pero seguro que se te ocurren muchas más. En este artículo, veremos algunas de las formas más populares de descargar archivos con Python.

Usando el módulo urllib.request

El módulo urllib.request se usa para abrir o descargar un archivo a través de HTTP. Específicamente, el método urlretrieve de este módulo es lo que usaremos para recuperar el archivo.

Para usar este método, debe pasar dos argumentos al método urlretrieve: el primer argumento es la URL del recurso que desea recuperar y el segundo argumento es la ruta del archivo local donde desea almacenar el archivo descargado. .

Echemos un vistazo al siguiente ejemplo:

1
2
3
4
5
6
import urllib.request

print('Beginning file download with urllib2...')

url = 'http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg'
urllib.request.urlretrieve(url, '/Users/scott/Downloads/cat.jpg')

En el código anterior, primero importamos el módulo urllib.request. A continuación creamos una variable url que contiene la ruta del archivo a descargar. Finalmente, llamamos al método urlretrieve y le pasamos la variable url como primer argumento, "/Users/scott/Downloads/cat.jpg" como segundo parámetro para el destino del archivo. Tenga en cuenta que puede pasar cualquier nombre de archivo como segundo parámetro y esa es la ubicación y el nombre que tendrá su archivo, suponiendo que tenga los permisos correctos.

Ejecute el script anterior y vaya a su directorio "Descargas". Debería ver su archivo descargado llamado "cat.jpg".

Nota: Esta urllib.request.urlretrieve se considera una "interfaz heredada" en Python 3, y puede quedar obsoleta en algún momento en el futuro. Debido a esto, no recomendaría usarlo en favor de uno de los métodos a continuación. Lo hemos incluido aquí debido a su popularidad en Python 2.

Uso del módulo urllib2

Otra forma de descargar archivos en Python es a través del módulo urllib2. El método urlopen del módulo urllib2 devuelve un objeto que contiene datos de archivo. Para leer el contenido de

Tenga en cuenta que en Python 3, urllib2 se fusionó con urllib como urllib.request y urllib.error. Por lo tanto, este script solo funciona en Python 2.

1
2
3
4
5
6
7
import urllib2

filedata = urllib2.urlopen('http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg')
datatowrite = filedata.read()
 
with open('/Users/scott/Downloads/cat2.jpg', 'wb') as f:
    f.write(datatowrite)

El método open acepta dos parámetros, la ruta al archivo local y el modo en que se escribirán los datos. Aquí "wb" establece que el método open debería tener permiso para escribir datos binarios en el archivo dado.

Ejecute el script anterior y vaya a su directorio "Descargas". Debería ver el documento pdf descargado como "cat2.jpg"

Uso del módulo de solicitud

También puede descargar archivos usando el módulo peticiones. El método get del módulo requests se utiliza para descargar el contenido del archivo en formato binario. Luego puede usar el método open para abrir un archivo en su sistema, tal como lo hicimos con el método anterior, urllib2.urlopen.

Echa un vistazo al siguiente script:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import requests

print('Beginning file download with requests')

url = 'http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg'
r = requests.get(url)

with open('/Users/scott/Downloads/cat3.jpg', 'wb') as f:
    f.write(r.content)

# Retrieve HTTP meta-data
print(r.status_code)
print(r.headers['content-type'])
print(r.encoding)

En el script anterior, el método “abrir” se usa una vez más para escribir datos binarios en un archivo local. Si ejecuta el script anterior y va a su directorio "Descargas", debería ver el archivo JPG recién descargado llamado "cat3.jpg".

Con el módulo solicitudes, también puede recuperar fácilmente metadatos relevantes sobre su solicitud, incluido el código de estado, los encabezados y mucho más. En el script anterior, puede ver cómo accedemos a algunos de estos metadatos.

Lo mismo ocurre con los parámetros adicionales que se requieren en la solicitud HTTP GET. Si necesita agregar encabezados de clientes, por ejemplo, todo lo que necesita hacer es crear un dict con sus encabezados y pasarlo a su solicitud get:

1
2
headers = {'user-agent': 'test-app/0.0.1'}
r = requests.get(url, headers=headers)

Hay un ton más de opciones y funciones en esta biblioteca, así que consulte su excelente guía del usuario para obtener más información sobre cómo usarlo.

Usando el módulo wget

Una de las formas más sencillas de descargar archivos en Python es mediante el módulo wget, que no requiere que abra el archivo de destino. El método download del módulo wget descarga archivos en una sola línea. El método acepta dos parámetros: la ruta URL del archivo a descargar y la ruta local donde se almacenará el archivo.

1
2
3
4
5
6
import wget

print('Beginning file download with wget module')

url = 'http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg'
wget.download(url, '/Users/scott/Downloads/cat4.jpg')

Ejecute el script anterior y vaya a su directorio "Descargas". Aquí debería ver el archivo "cat4.jpg" recién descargado.

Conclusión

En este artículo presentamos cuatro de los métodos más utilizados para descargar archivos en Python. Personalmente, prefiero usar el módulo request para descargar archivos debido a su combinación de simplicidad y potencia. Sin embargo, su proyecto puede tener restricciones que le impiden usar bibliotecas de terceros, en cuyo caso usaría el módulo urllib2 (para Python 2) o el módulo urllib.request (para Python 3).

¿Qué biblioteca prefieres y por qué? ¡Cuéntanos en los comentarios!

Licensed under CC BY-NC-SA 4.0