Descargar archivos vía HTTP con urllib y urllib2

Los módulos urllib y urllib2 permiten abrir y manejar sitios web de una manera sencilla. Cada archivo retornado por urlopen es similar al tipo file. Por lo tanto, la función read devuelve su contenido. Documentos o páginas webs de gran tamaño requieren de una función que permita conocer el estado de la descarga, cuántos bytes se han obtenido y cuántos restan, para evitar que nuestro programa quede colgado sin dar señales de vida cuando en realidad está leyendo un determinado archivo. Ésta se llama urllib.urlretrieve y permite pasar una función como parámetro que será llamada cada vez que se reciba un bloque de bytes. Los siguientes códigos de fuente muestran ambos métodos para descargar archivos vía HTTP en Python 2. Python 3 presenta varios cambios, véanse las notas en urllib y urllib2. Para un código similar en Python 3, véase Cómo descargar un archivo vía HTTP.

Descargar ejemplo como ZIP

download1.py (sin progreso)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#       download1.py
#       
#       Copyright 2013 Recursos Python - www.recursospython.com
#       
#

from urllib2 import urlopen

def main():
    url = ("https://www.recursospython.com/wp-content/uploads/2013/08/"
           "compresion_y_descompresion.zip")

    # Archivo web
    r = urlopen(url)

    # Nombre del archivo a partir del URL
    filename = url[url.rfind("/") + 1:]

    while not filename:
        filename = raw_input("No se ha podido obtener el nombre del "
                             "archivo.\nEspecifique uno: ")

    print "Descargando %s..." % filename

    # Archivo local
    f = open(filename, "wb")

    # Escribir en un nuevo fichero local los datos obtenidos vía HTTP.
    f.write(r.read())

    # Cerrar ambos
    f.close()
    r.close()

    print "%s descargado correctamente." % filename

if __name__ == "__main__":
    main()

download2.py (con progreso)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#       download2.py
#       
#       Copyright 2013 Recursos Python - www.recursospython.com
#       
#

from urllib import urlretrieve, urlcleanup

def status(count, data_size, total_data):
    """Llamado por cada bloque de datos recibido"""
    print count, data_size, total_data
    
def main():
    url = ("https://www.recursospython.com/wp-content/uploads/2013/08/"
           "compresion_y_descompresion.zip")

    # Nombre del archivo a partir del URL
    filename = url[url.rfind("/") + 1:]

    while not filename:
        filename = raw_input("No se ha podido obtener el nombre del "
                             "archivo.\nEspecifique uno: ")
    
    print "Descargando %s..." % filename
    
    urlretrieve(url, filename, status)  # Descargar archivo
    urlcleanup()  #  Limpiar cache
    
    print "%s descargado correctamente." % filename

if __name__ == "__main__":
    main()

Curso online 👨‍💻

¡Ya lanzamos el curso oficial de Recursos Python en Udemy! Un curso moderno para aprender Python desde cero con programación orientada a objetos, SQL y tkinter en 2024.

Consultoría 💡

Ofrecemos servicios profesionales de desarrollo y capacitación en Python a personas y empresas. Consultanos por tu proyecto.

2 comentarios.

    • Recursos Python says:

      Eso no parece ser un error de Python sino del sistema, ¿estás seguro que tenés acceso a la dirección que estás intentando abrir?

Deja una respuesta