descargar de Issuu
Python
Publicado el 8 de Abril del 2015 por Pal
5.563 visualizaciones desde el 8 de Abril del 2015
Con la url de una publicación de Issuu.com, descarga el libro completo y lo deja en ~/Documentos en formato .pdf
#!/usr/bin/env python
'''
Created on 19/02/2015
Primer programa en Python
@author: palvilla
'''
import pygtk
import gtk
import os
import re
import urllib2
import subprocess
" Interface Grafica - Clase para el Loop principal"
class MainGui:
def __init__(self):
"creamos una ventana"
self.ventana = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.ventana.set_title('Descarga Issuu')
"Es buena idea hacer esto para todas las ventanas"
self.ventana.connect("destroy", lambda wid: gtk.main_quit())
self.ventana.connect("delete_event", lambda a1,a2:gtk.main_quit())
"grosor de la ventana"
self.ventana.set_border_width(10)
"creamos una tabla de 2x2"
tabla1 = gtk.Table(8,2,gtk.TRUE)
"metemos la tabla en la ventana"
self.ventana.add(tabla1)
"rellenamos"
self.etiq_nombre = gtk.Label("Nombre del libro a crear? ")
tabla1.attach(self.etiq_nombre,0,1,0,1)
self.mete_nombre = gtk.Entry()
tabla1.attach(self.mete_nombre,0,1,1,2)
self.etiq_url = gtk.Label("Direccion Url: ")
tabla1.attach(self.etiq_url,0,1,2,3)
self.mete_url = gtk.Entry()
tabla1.attach(self.mete_url,0,2,3,4)
self.boton_ok = gtk.Button("Crear Libro")
self.boton_ok.connect("clicked",self.empieza)
tabla1.attach(self.boton_ok,1,2,6,7)
self.boton_ko = gtk.Button("Salir")
self.boton_ko.connect("clicked",self.evento_de_borrado, None)
tabla1.attach(self.boton_ko,0,1,6,7)
self.ventana.show_all()
def evento_de_borrado(self, widget, event, data=None):
gtk.main_quit()
return gtk.FALSE
def error(self, message):
"Ventana generica de error. Se le pasan los mensajes a mostrar"
dialog_error = gtk.MessageDialog(parent=None, flags=0, buttons=gtk.BUTTONS_OK)
dialog_error.set_title("Atencion")
label = gtk.Label(message)
dialog_error.vbox.pack_start(label, True, True, 0)
"Con show_all() mostramos el contenido del cuadro de dialogo (en este \
caso solo tiene la etiqueta) si no se hace el dialogo aparece vacio "
dialog_error.show_all()
"El run y destroy hace que la ventana se cierre al apretar el boton"
dialog_error.run()
dialog_error.destroy()
def empieza(self, widget):
"empezamos recuperando datos de las cajas de texto"
while True:
libro = self.mete_nombre.get_text()
if libro == "":
self.error("Me falta el nombre del libro")
print "introduzca un nombre"
self.mete_nombre.set_text("")
self.mete_url.grab_focus()
return
else:
libro = libro.replace(" ","_")
print " Nombre del libro " + libro
url_user=self.mete_url.get_text()
try:
''' Comprobamos que la direccion es correcta '''
print "Comprobando la pagina. Espere un momento" , url_user
respuesta=urllib2.Request(url_user)
handle = urllib2.urlopen(url_user)
break
except:
self.error("Aqui no encuentro ningun libro. Comprueba la direccion.")
self.mete_url.set_text("")
self.mete_url.grab_focus()
return
pagina = handle.readlines()
for x in pagina:
m = re.search(r'(<meta property=\"og:image\")', x, re.I)
if m:
# hemos encontrado la linea
t = re.search(r'(http://image.issuu.com/)(.[^/]*)',x,)
dir_tmp = "~/temp/"+t.group(2)
dir_tmp = os.path.expanduser(dir_tmp)
Crea_dir(dir_tmp)
descargajpgs(t.group(2))
for (path, dirs, files) in os.walk(os.getcwd()):
numpag = len(files)
cadena = ''
for i in range(numpag):
# convertirmos una a una los .jpg en .pdf
comando = 'convert '+str(i+1)+'.jpg '+str(i+1)+'.pdf'
Ejecuta_comando(comando)
cadena = cadena + str(i+1)+'.pdf '
print "Creando el libro "+libro+".pdf"
comando= 'pdftk '+cadena+'cat output '+libro+'.pdf'
Ejecuta_comando(comando)
'''Movemos el libro a Documentos '''
comando = 'cp '+libro+'.pdf ~/Documentos/'
Ejecuta_comando(comando)
''' borramos limpiamos y salimos '''
Borra_dir(dir_tmp)
self.mete_nombre.set_text("")
self.mete_url.set_text("")
self.error("Creado el libro "+libro+" en ~/Documentos")
return False
def Crea_dir(dir):
''' Creamos el directorio temporal para la descarga de .jpg'''
try:
os.makedirs(dir)
except OSError:
if not os.path.isdir(dir):
raise
finally:
os.chdir(dir)
print os.getcwd()
return
def Borra_dir(dir):
for root, dirs, files in os.walk(dir):
for name in files:
os.remove(os.path.join(root, name))
for name in dirs:
os.rmdir(os.path.join(root, name))
os.rmdir(root)
return
def Ejecuta_comando(x):
salida = subprocess.Popen(x, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell = True).communicate()[0]
salida = salida.split(os.linesep)[0] # introduce un retorno de linea como segundo parametro de salida
return (salida)
def descargajpgs(cod):
descarga = 0
while True:
descarga += 1
url = 'http://image.issuu.com/'+cod+'/jpg/page_'+str(descarga)+'.jpg'
print url
print descarga
try:
req = urllib2.Request(url)
respuesta = urllib2.urlopen(req)
except urllib2.URLError as e:
if hasattr( e, 'reason' ):
print( 'Fail in reaching the server -> ', e.reason )
break
elif hasattr( e, 'code' ):
print( 'The server couldn\'t fulfill the request -> ', e.code )
break
else:
with open( str(descarga)+'.jpg', 'wb' ) as fo:
fo.write( respuesta.read() )
if __name__ == "__main__":
MainGui()
gtk.main()
Comentarios sobre la versión: 0.1 (1)
Lo único, que he tenido que modificar la url de copia, ya que no me realizaba la copia correctamente.
He tenido que poner:
comando = 'cp '+dir_tmp+"/"+libro+'.pdf ~/Documents/'