24/7/13

Python - Código Descargar Imágenes


Buenas a todos, después de darle muchas vueltas a unos cuantos de programitas que encontre, he realizado este pequeño programa.

Nos pide una URL y el nombre del directorio a crear, donde descargara todas las imágenes de dicha URL.
 
'''
Created on 23/07/2013

@author: aaguilar
'''

import urllib
import urllib2
import re
import sys
import os
from os.path import basename
from urlparse import urlsplit
 

EXTENSIONS = ['.jpg','.png','.gif','.jpeg']

def download_images_from_url(url):

    fichero = raw_input("Ingrese nombre del fichero donde descargar las imagenes >")    
    #Almaceno el directorio actual para volver al terminar
    directorioOriginal = os.getcwd()
    #Creamos el nuevo directorio
    directorio = os.path.join(fichero)
    if not os.path.isdir(directorio):
        os.mkdir(directorio)
    os.chdir(directorio)
       
    if not url.lower().startswith('http://') and not url.lower().startswith('https://'):
        url = 'http://%s'%url
        print 'Descargando imagenes desde %s...'%url
        print
        urlContent = urllib2.urlopen(url).read()

        # Busqueda del tag img en la pagina web.
        # HTML image tag: <img src="url" alt="some_text"/>

        imgUrls = re.findall('img .*?src="(.*?)"', urlContent)
        print "+--------------------------------------+"
        print "+ Descarga de imagenes                 +"
        print "+--------------------------------------+"
        print "+                                      +"
        print "+ Web:",url,(" "*(31-len(url)))+"+"
        print "+ Cantidad de imagenes: ",len(imgUrls),(" "*(13-len(str(len(imgUrls)))))+"+"
        print "+                                      +"
        print "+--------------------------------------+"
        print
 

        #Recorremos todas las imagenes
        for i in range(len(imgUrls)):
            if not imgUrls[i].lower().startswith('http://') and not url.lower().startswith('https://'):
                imgUrls[i] = url+"/"+imgUrls[i]
             

            nombreImagen = imgUrls[i][imgUrls[i].rfind('/')+1:len(imgUrls[i])]
            #llamamos al método que la descarga        
            download(imgUrls[i],nombreImagen,directorio)
                       
    print "Imagenes descargadas correctamente en > " + os.getcwd()
    os.chdir(directorioOriginal) # vuelve al directorio inicial
   
                       
def download(url, NOMBRE,directorio):
    try:
        furl = urllib2.urlopen(url)
        f = file(NOMBRE,'wb')
        f.write(furl.read())
        f.close()
        print "Descarga completada -->",NOMBRE
        print
        print
    except:
        print 'Unable to download file'
 

#Comenzamos
try:

    if __name__ == '__main__':
        args = sys.argv
               
        if len(args) < 2:
            url = raw_input("Ingrese URL >")
            download_images_from_url(url)
            print
        else:
            download_images_from_url(args[1])
            print       
        exit(0)

       
except Exception, e:
    print e
finally:
    print "Operacion Finalizada."


Os presento ahora una modificación que he realizado en el código, para solucionar que hay web que si detectan que no es un navegador el que realiza la petición, no nos permite recorrerla. Por otro lado subsanamos el problema que puede darse cuando las imagenes no tienen extensión, lo solucionamos añadiendole una por defecto, además añadimos un tratamiento por si el nombre de la imagen es relativo y tiene caracteres especiales, le damos un nombre aleatorio a la imagen.

'''
Created on 26/07/2013

@author: aaguilar
'''

import urllib
import urllib2
import re
import sys
import os
import time
from os.path import basename
from urlparse import urlsplit

EXTENSIONS = ['.jpg','.png','.gif','.jpeg']

def download_images_from_url(url):
   
    print url
   
    fichero = raw_input("Ingrese nombre del fichero donde descargar las imagenes >")


    #Almaceno el directorio actual para volver al terminar
    directorioOriginal = os.getcwd()
    directorio = os.path.join(fichero)

    #Creamos el nuevo directorio    
    if not os.path.isdir(directorio):
        os.mkdir(directorio)
    os.chdir(directorio)
       
    if not url.lower().startswith('http://') and not url.lower().startswith('https://'):
        url = 'http://%s'%url
   
    print 'Descargando imagenes desde %s...'%url
    print url
    #urlContent = urllib2.urlopen(url).read()
   
   
    values = {'name' : 'Yo'}
    data = urllib.urlencode(values)
    headers = {'User-agent': 'Mozilla/5.0' }
    req = urllib2.Request(url, data, headers)
    response = urllib2.urlopen(req)
    urlContent = response.read()


   
# Busqueda del tag img en la pagina web.
    # HTML image tag: <img src="url" alt="some_text"/>
   

    imgUrls = re.findall('img .*?src="(.*?)"', urlContent)
    print "+--------------------------------------+"
    print "+ Descarga de imagenes                 +"
    print "+--------------------------------------+"
    print "+                                      +"
    print "+ Web:",url,(" "*(31-len(url)))+"+"
    print "+ Cantidad de imagenes: ",len(imgUrls),(" "*(13-len(str(len(imgUrls)))))+"+"
    print "+                                      +"
    print "+--------------------------------------+"
    print
       
    # download all images
    contador = 0

  #Recorremos todas las imagenes
     for i in range(len(imgUrls)):
        print imgUrls[i]
        if not imgUrls[i].lower().startswith('http://') and not url.lower().startswith('https://'):
            imgUrls[i] = "http:"+imgUrls[i]
       
        nombreImagen = imgUrls[i][imgUrls[i].rfind('/')+1:len(imgUrls[i])]
 

        #Tratamos imagenes cuyo nombre tienen caracteres especiales
        if ('>' in nombreImagen or '<' in nombreImagen or '|' in nombreImagen or ':' in nombreImagen or '*' in nombreImagen or '"' in nombreImagen or '/' in nombreImagen  or '?' in nombreImagen or
'\\' in nombreImagen):
            contador = contador +1
            nombreImagen = "imagen"+str(contador)+".jpg"

        #Tratamos imagenes que no indican el formato
        elif '.' not in nombreImagen:
            contador = contador +1
            nombreImagen = "nombreImagen"+".jpg"


        #llamamos al método que la descarga          
        download(imgUrls[i],nombreImagen,directorio)
                       
    print "Imagenes descargadas correctamente en > " + os.getcwd()
    os.chdir(directorioOriginal) # vuelve al directorio inicial
   
                       
def download(url, NOMBRE,directorio):
    try:
        furl = urllib2.urlopen(url)
        #f = file("%s.png"%NOMBRE,'wb')
        f = file(NOMBRE,'wb')
        f.write(furl.read())
        f.close()
        print "Descarga completada -->",NOMBRE
        print
        print
       
    except:
        print 'Unable to download file'

#Comenzamos
 try:
    if __name__ == '__main__':
        args = sys.argv
               
        if len(args) < 2:
            url = raw_input("Ingrese URL >")
            print time.asctime()
            download_images_from_url(url)
            print
        else:
            download_images_from_url(args[1])
            print
       
        exit(0)

except Exception, e:
    print e
finally:
    print "Operacion Finalizada."
    print time.asctime()
   
     
   
               
    


No hay comentarios :

Publicar un comentario