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
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 "+--------------------------------------+"
#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
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)
else:
download_images_from_url(args[1])
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 "+--------------------------------------+"
# 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
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)
else:
download_images_from_url(args[1])
exit(0)
except Exception, e:
print e
finally:
print "Operacion Finalizada."
print time.asctime()
Suscribirse a:
Enviar comentarios
(
Atom
)
No hay comentarios :
Publicar un comentario