[Python] Descargar Archivos - by NiKo

Iniciado por ProcessKill, Febrero 24, 2010, 04:04:47 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Febrero 24, 2010, 04:04:47 PM Ultima modificación: Marzo 23, 2015, 12:15:41 PM por Expermicid
Bueno esto es simplemente un mini-tutorial acerca de las distintas alternativas que tenemos en python
para descargar archivos.
Python es un lenguaje que facilita todo gracias a los diversos modulos que vienen ya preinstalados con el interprete
los cuales simplifican mucho las tareas que serian muy dificiles o aburridas para hacer, con respecto al tratamiento
web el interprete python viene con modulos como urllib, urllib2, httplib, cookielib, etc. que ahorran el trabajo de
hacer las cosas directamente con sockets.

Para descargar un archivo hay varias opciones:
         * Trabajar directamente con sockets.
         * Utilizar los modulos que se especializan en interaccion web (urllib, urllib2).
         * Usar modulos y paquetes externos a los estandar, ejemplo: PyCurl.
         
         
1.- Descargar usando el modulo urllib:
   Para descargar un archivo usando este modulo, hay que hacer uso de la funcion en el llamada "urlretrieve".
   Esta funcion toma tres parametros: El primero es la url del archivo. El segundo parametro es el nombre del archivo
   con el que se va a guardar. Y el tercer parametro sirve para especificar si se quiere mostrar el progreso de
   la descarga, a lo cual si se quiere mostrar se pasa el parametro que debe ser una funcion que debe contener tres
   parametros numericos, esta funcion luego sera llamada y nos sirve a nosotros para especificar el progreso de la descarga
   por ejemplo.
   Bueno echa ya la explicacion de como funcion urlretrieve les dejo un code para que se aclare un poco mas la cosa:
   ---------------------------------------------------------------------------------------------------------------------------
   
Código: python

#! /usr/bin/env python

import urllib, sys #Importamos urllib para utilizar urlretrieve, y sys para printear con 'sys.stdout.write'

def funcionprogreso(bloque, tamano_bloque, tamano_total): #Definimos la funcion de progreso con tres parametros que tomaran los valores que les pase la funcion urlretrieve
cant_descargada = bloque * tamano_bloque #Cantidad descargada = Bloque descargado 1 * cantidad de bytes que tiene cada bloque
sys.stdout.write('\rCantidad descargada: %s bytes / %s bytes totales' % (cant_descargada, tamano_total)) #Imprimimos el progreso de la descarga

archivo = urllib.urlretrieve("http://forum.get-r00t.com/Themes/tux_Red_Planet/images/tuxspace.png", "tux.png", reporthook=funcionprogreso) # Descargamos el archivo pasandole
#los tres parametros (Url_del_archivo, nombre_de_archivo_en_disco, informacion_progreso)
#Nota si no quieres mostrar ningun progreso durante la descarga solo pon asigna reporthook como None.

   -------------------------------------------------------------------------------------------------------------------------------
   
   
   
2.- Descargar usando el modulo urllib2:
   En el modulo urlib2 no contamos con la funcion retrieve pero eso no significa que no podamos descargar un archivo....
   Este metodo es el que yo uso simplemente por costumbre xD...
   Bueno los pasos para descargar son muy sencillos, cargamos urllib2 (obvio no? xD) abrimos la url con la funcion urlopen() leemos el contenido
   del archivo remoto y lo vamos copiando a un archivo.
   El tema del progreso de la descarga es bastante sencillo yo conozco solo dos opciones para lo fundametal y mas importante para el progreso de la
   descarga que es el tamaño del archivo para sacar el tamaño yo conozco solo dos formas:
   La primera y que mas me gusta seria obtener informacion del archivo que habrimos con urlopen (que no son mas que cabeceras http) mediante el metodo info(), luego de todas
   las cabeceras que retorna esa funcion sacar la unica que nos importa que seria en este caso: Content-Length.
   La otra forma es utilizando el metodo __len__() que mide la longitud de un objeto... vale la pena aclarar que todos los objetos en python cuentan con este y otros metodos mas
   predefinidos.
   Y aca lo mas importante y lo que va a terminar de aclarar todo.. el code de ejemplo:
   ----------------------------------------------------------------------------------------------------------------------------------------------------------------
   
Código: python

#! /usr/bin/env python

import urllib2, sys #Importamos urllib2 y sys

archivo = urllib2.urlopen("http://forum.get-r00t.com/Themes/tux_Red_Planet/images/tuxspace.png") #Abrimos el archivo que vamos a descargar
informacion_tamano = archivo.info() #Obtenemos un par de headers que nos dan informacion acerca del archivo
tamano_archivo = informacion_tamano.getheaders("Content-Length")[0] #Obtenemos el tamano del archivo a traves del header Content-Length
tamano_archivo = int(tamano_archivo) / 1024 #Pasamos el tamano a kilobytes
byte = 1
arch = open('tuxspace.png', 'wb') #Abrimos el archivo para escribirlo
while (byte != tamano_archivo): #Mientras el numero byte leido sea distinto al ultimo byte del archivo
arch.write(archivo.read(byte)) #Escribir byte
byte += 1 #Agregar uno al contador para que no escriba siempre el mismo byte xD
sys.stdout.write('\r[*]Descargados:  %8s Kbs de %s Kbs' % (byte, tamano_archivo)) #Mostrar la informacion de la descarga
arch.close() # Cerrar el archivo

   ----------------------------------------------------------------------------------------------------------------------------------------------------------------

Bueno era eso nada mas, aunque es re basico y lo explique a las apuradas, ojala a alguien le sirva xD
Saludos !!

Hola una pregunta, en donde quedan las descargas que hago desde python, saludos

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Hola una pregunta, en donde quedan las descargas que hago desde python, saludos
Donde puedes leer
Código: php
"tux.png"
, ahi pones la ruta.
Sigueme en Twitter : @Sankosk
Estos nuevos staff no tienen puta idea XD

que nostalgia este tema lo lei en code-makers hace 3 años xDD.