En este tutorial, aprenderá a como descargar archivos desde la web utilizando diferentes modulos de Python. Además, descargará archivos, páginas web, Amazon S3 y otras fuentes.
Por último, aprenderá cómo superar diferentes tipos de desafíos que puede encontrar, como descargar archivos que redirigen, descargar archivos grandes, completar una descarga con hilos y otras tácticas.
Uso del Request
Se puede descargar archivos desde una URL utilizando el módulo de request. Considere el siguiente código:
1 2 3 4 | import requests url = 'https://www.python.org/static/img/python-logo@2x.png' myfile = requests.get(url) open('downloads/PythonImage.png', 'wb').write(myfile.content) |
Simplemente obtenga la URL usando get, que es un método del módulo de request y almacene en una variable llamada «myfile». Luego, escribe el contenido de la variable en un archivo.
Uso de wget
También se puede descargar un archivo desde una URL utilizando el módulo wget de Python. El módulo wget se puede instalar utilizando pip.
Considere el siguiente código, que utilizaremos para descargar el logo de Python:
1 2 3 4 | import wget url = "https://www.python.org/static/img/python-logo@2x.png" wget.download(url, 'c:/users/LikeGeeks/downloads/pythonLogo.png') |
En este código, la URL, junto con la ruta(donde se almacenará la imagen), se pasa al método de descarga del módulo wget.
Descargar un archivo que hace redirección
En esta sección, aprenderá a descargar desde una URL, que redirige a otra URL con un archivo .pdf mediante solicitudes. Para descargar este archivo pdf, use el siguiente código:
1 2 3 4 5 | import requests url = 'https://readthedocs.org/projects/python-guide/downloads/pdf/latest/' myfile = requests.get(url, allow_redirects=True) open('c:/users/LikeGeeks/documents/hello.pdf', 'wb').write(myfile.content) |
Luego, usamos el método get del módulo de request para obtener la URL. En el método get, establecemos allow_redirects en True, que permitirá la redirección en la URL, y el contenido después de la redirección se asignará a la variable myfile.
Finalmente, abrimos un archivo para escribir el contenido obtenido.
Descargar archivos grandes
Considere el siguiente código:
1 2 3 4 5 6 7 8 9 | import requests url_stream = 'https://readthedocs.org/projects/python-guide/downloads/pdf/latest/' my_stream_file = requests.get(url_stream, stream=True) path = 'data/python_guide_stream.pdf' with open(path, 'wb') as f: for ch in my_stream_file: f.write(ch) |
Primero, usamos el método get del módulo de request como lo hicimos antes, pero esta vez, configuraremos el atributo stream en True.
Luego, creamos un archivo llamado PythonBook.pdf en el directorio de trabajo actual y lo abrimos para escribir.
Luego, especificamos el tamaño del fragmento que queremos descargar a la vez. Hemos establecido 1024 bytes, iteramos a través de cada fragmento y escribimos los fragmentos en el archivo hasta que terminen.
Descarga de multiples archivos (Descarga Paralela/Masiva)
Para descargar multiples archivos al mismo tiempo, se deben utilizar los siguientes módulos:
1 2 3 4 | import os import requests from time import time from multiprocessing.pool import ThreadPool |
Importamos los módulos os y time para verificar cuánto tiempo lleva descargar los archivos. El módulo ThreadPool le permite ejecutar múltiples hilos o procesos usando el grupo.
Creamos una función simple que envíe la respuesta a un archivo:
1 2 3 4 5 6 7 8 | def url_response(url): path, url = url r = requests.get(url, stream = True) with open(path, 'wb') as f: for ch in r: f.write(ch) |
Las URL son una matriz bidimensional que especifica la ruta y la URL de una página que desea descargar.
1 2 3 4 5 6 7 8 | urls = [("Event1", "https://www.python.org/events/python-events/805/"), ("Event2", "https://www.python.org/events/python-events/801/"), ("Event3", "https://www.python.org/events/python-events/790/"), ("Event4", "https://www.python.org/events/python-events/798/"), ("Event5", "https://www.python.org/events/python-events/807/"), ("Event6", "https://www.python.org/events/python-events/807/"), ("Event7", "https://www.python.org/events/python-events/757/"), ("Event8", "https://www.python.org/events/python-user-group/816/")] |
Pase la URL a request.get como lo hicimos en la sección anterior. Finalmente, abra el archivo (ruta especificada en la URL) y escriba el contenido de la página.
Ahora, podemos llamar a esta función para cada URL por separado, y también podemos llamar a esta función para todas las URL al mismo tiempo. Hagámoslo para cada URL por separado en el bucle for y observemos el temporizador:
1 2 3 4 | start = time() for x in urls: url_response (x) print(f"Time to download: {time() - start}") |
Ahora reemplace el bucle por la siguiente línea de código:
1 | ThreadPool(9).imap_unordered(url_response, urls) |
Ejecute el script.
En mi caso la diferencia de tiempos fue bastante considerable:
1 2 | Time to download with for: 4.671679258346558 Time to download with thread: 0.02076435089111328 |
En este artículo hemos revisado algunas formas de descarga, en un artículo posterior revisaremos algunas otras formas.
Este artículo se encuentra basado en Simple Examples of Downloading Files Using Python.