Descargar archivos vía HTTP con urllib y urllib2



Versión: Python 2.x.

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.

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 = ("http://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 = ("http://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()



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 un comentario