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.
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.
Christian says:
no me sirve, cuanto intento correrlo. 🙁
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?