Commits

Anonymous committed a6a27a4 Merge

Combinar

Comments (0)

Files changed (8)

 12049f88987eb412de21a8905ee396b2f7bf618a v1.0
 dbf78b13ab9f0def0e9ccc9f151ee70a867e5fed v1.0.1
 2207ee98fa7935328834ee26e1e8f15f264021f3 v1.1
+2a579d535ac2e726f1aeba48f631604273883ab6 v2
+# -*- coding: utf-8 -*-
+"""
+Created on Thu May 08 14:51:06 2014
+
+@author: jmcortesa
+"""
+
+# Parámetros
+YEAR1 = 2010
+YEAR2 = 2014
+
+# Parámetros fijados
+MAXITEMS = 500
+PUBLANG = "Castellano"
+
+
+# Leer parámetros de búsqueda
+from util import openutf8, openlat1
+
+MATERIAS = dict(r[:-1].split("\t", 1)
+                for r in openutf8("materias.txt") if r != "\n")
+EDITORIALES = {
+    unicode(k): [t for t in s.split("\t") if t]
+    for (k, s) in
+        (r[:-1].split("\t", 1)
+         for r in openlat1("editoriales2.txt") if r != "\n")
+}
+# -*- coding: utf-8 -*-
+"""
+Created on Thu May 08 14:43:45 2014
+
+@author: jmcortesa
+"""
+
+import sqlite3
+
+# Base de datos
+DB_FILE = "libros.sqlite"
+DB = sqlite3.connect(DB_FILE,)
+
+INSERTS = {
+    "libros": """insert into libros(ISBN,
+                                    idbook,
+                                    título,
+                                    id_editorial,
+                                    editorial,
+                                    año,
+                                    IBIC,
+                                    materia)
+                        values(?,?,?,?,?,?,?,?)""",
+}
+
+
+def init_db():
+
+    from config import MATERIAS, EDITORIALES
+
+    with DB:
+
+        DB.execute("drop table IF EXISTS libros")
+        DB.execute("drop table IF EXISTS materias")
+        DB.execute("drop table IF EXISTS editoriales")
+        DB.execute("drop table IF EXISTS logs")
+
+        DB.execute("""create table materias (ibic varchar(5) PRIMARY KEY,
+                                             desc text)""")
+        DB.executemany("insert into materias values(?,?)",
+                       MATERIAS.iteritems())
+
+        DB.execute("""create table editoriales (id varchar(5),
+                                                nombre varchar(60),
+                                                codigos text)""")
+        DB.executemany("insert into editoriales(nombre, codigos) values(?,?)",
+                       ((nombre, repr(codes))
+                        for (nombre, codes) in EDITORIALES.iteritems()))
+
+        DB.execute("""create table libros(
+                            ISBN text,
+                            idbook text,
+                            título text,
+                            id_editorial text,
+                            editorial text,
+                            año integer,
+                            IBIC text,
+                            materia text)""")
+
+        DB.execute("""create table logs(
+                            fecha timestamp DEFAULT CURRENT_TIMESTAMP,
+                            desc  text)""")
+
+        log("Tablas creadas")
+
+
+def log(*msg):
+    with DB:
+        DB.execute("insert into logs(desc) values(?)", [" ".join(msg)])
+Algaida Editores	978-84-7647	978-84-9067	978-84-8433	978-84-9877			
+ANAYA	978-84-207	978-84-678	978-84-667				
+BARCANOVA Esports	978-84-95184 						
+Cambridge University Press	978-84-8323	978-84-9036					
+CRU�LLA	978-84-7629 	978-84-661	978-84-8286				
+DIFUSION CENTRO DE INVESTIGACION Y PUBLICACIONES DE IDIOMAS S.L.	978-84-87099	978-84-8443	978-84-89344	978-84-15846	978-84-16057	978-84-15640	978-84-15620
+Ediciones Aljibe, S.L.	978-84-87767	978-84-95212	978-84-9700				
+Ediciones del Laberinto S. L	978-84-87482	978-84-8483	978-84-16009				
+Ediciones del Serbal, S.A.	978-84-7628 	978-84-85800					
+Ediciones Generales Anaya, S.A.	978-84-7525						
+Ediciones Grazalema, S.L.	978-84-87932	978-84-8305					
+Ediciones Obradoiro, S.A.	978-84-87937	978-84-8224	978-84-9972				
+EDICIONES SM	978-84-348	978-84-675					
+Edicions Bromera, S.L.	978-84-7660 	978-84-9026 	978-84-15390	978-84-9824			
+Edicions Voramar, S.L.	978-84-9807	978-84-8194	978-84-9058	978-84-87938 			
+Edici�ns Xerais	978-84-7507	978-84-8302	978-84-9914	978-84-9782			
+Editorial Bru�o	978-84-216	978-84-696				
+Editorial Casals	978-84-218					
+Editorial Donostiarra, S.A.	978-84-7063					
+Editorial Editex	978-84-7131	978-84-9078	978-84-9003	978-84-9771		
+Editorial Everest	978-84-241	978-84-441				
+Editorial Magisterio	978-84-265 					
+Editorial Onda	978-84-7552	 978-84-85683				
+Editorial Teide, S.A.	978-84-307					
+Elkar-Ikastolak Zerbitzuak S.L.	978-84-15586	978-84-939279	978-84-939418	978-84-939189		
+Erein Argitaletxea, S.A.	978-84-7568	978-84-9746	 978-84-85324			
+Espa�ol Santillana-USAL	978-84-934772	978-84-936688	978-84-937596			
+Santillana Fran�ais	978-84-96597	978-84-9049	978-84-92729			
+Santillana, S. L.	978-84-294	978-84-680 				
+Giltza	978-84-8118	978-84-8378				
+Grup Promotor, S.L.	978-84-7911	978-84-7918	978-84-85820	978-84-8435	978-84-9047	978-84-15435
+Grupo EDEB�	978-84-236	978-84-683 				
+Guadiel (GRUPO EDEB�)	978-84-8117	978-84-8379					
+MacMillan	978-84-7942	978-84-15656	978-84-16092	978-84-15430	 978-84-15991	978-84-15426	978-84-15836
+Marjal	978-84-8348 	978-84-8115					
+McGraw-Hill Interamericana de Espa�a S.L.	978-84-481	978-84-486	978-84-85240	 978-84-7615			
+Oxford University Press Espa�a, S.A.	978-84-673	978-84-8104					
+Pearson Educaci�n	978-84-9035	978-84-938543	978-84-15552	978-84-939556	978-84-939315	978-84-938825	
+Richmond	978-84-668						
+RODEIRA - GRUPO EDEBE	978-84-8116	978-84-8349	 978-84-96352				
+S.G.E.L.	978-84-9778	978-84-7143					
+Text-la Galera	978-84-246	978-84-941857	978-84-940801				
+Zubia Editoriala, S.L.	978-84-8147	978-84-9894	978-84-88227				
+Vicent Vives	978-84-316	978-84-682 					
+Edelvives	978-84-263 						
     return [isbn, idbook, title, id_editorial, editorial, year]
 
 
-def get_books(query, msg=""):
+def get_books(query, logger=None):
+
+    if logger is None:
+        def logger(*x):
+            print " ".join(x)
 
     def get_page(urlbase):
         req2 = urllib2.Request(urlbase, str(query))
         response = urllib2.urlopen(req2)
         return response.read()
 
-    print(msg)
-
     cookie = get_cookie()
 
     html = get_page(SEARCH)
     total = 0
     aviso = soup.find("div", id="aviso")
     if aviso is not None:
-        print "AVISO:", aviso.text
+        logger("AVISO:", aviso.text)
     else:
         info = soup.find("div", class_="stTextos")
         if info:
             m = PAT_RESULTS.search(info.text)
             total = m.group(1) if m else 0
-            print "  ", info.text
+            logger("  ", info.text)
     query.set_total(total)
 
     books = soup.find_all("div", class_="isbnResultado")
         html = get_page(METHOD)  # cambia la URL
         soup = bs4.BeautifulSoup(html, "html.parser", from_encoding="ISO-8859-1")
         info = soup.find("div", class_="stTextos")
-        print "  ", info.text
+        logger("  ", info.text)
 
         books = soup.find_all("div", class_="isbnResultado")
 
+# -*- coding: utf-8 -*-
+"""
+Created on Tue May 06 15:09:14 2014
+
+@author: jmcortesa
+"""
+
+__updated__ = "2014-04-14 19:10"
+
+import time
+
+from mk_query import QA_IBIC_ISBN
+from get_isbn import get_books
+
+from util import to_unicode
+from database import DB, INSERTS, log, init_db
+from config import MATERIAS, EDITORIALES
+from config import YEAR1, YEAR2, MAXITEMS, PUBLANG
+
+
+def captura():
+
+    sql_insert = INSERTS["libros"]
+
+    for editorial, isbns in EDITORIALES.items():
+        for isbn in isbns:
+            for materia, m_desc in MATERIAS.items():
+
+                query = QA_IBIC_ISBN(materia, isbn, YEAR1, YEAR2,
+                                     maxitems=MAXITEMS,
+                                     publanguage=PUBLANG)
+                msg = "IBIC:{} ISBN:{} Editorial:{}".format(materia,
+                                                            isbn,
+                                                            editorial)
+                log(msg)
+
+                for book in get_books(query, logger=log):
+                    data = book + [materia, m_desc]
+                    data = [to_unicode(x) for x in data]
+                    DB.execute(sql_insert, data)
+
+                DB.commit()
+                time.sleep(2)  # Espera de 2 segundos entre peticiones
+
+    DB.commit()
+
+
+if __name__ == "__main__":
+
+    init_db()
+    log("Inicio correcto")
+
+    captura()
             "params.reAnnoPublica.annoDesde": year1,
             "params.reAnnoPublica.annoEntre": year2,
         })
+
+
+class QA_ISBN(QueryArgs):
+
+    def __init__(self, isbn_prefix,
+                 year1="", year2="",
+                 maxitems=50, publanguage="Castellano"):
+        """
+        Búsqueda por ISBN.
+
+        :isbn_prefix:       inicio del código isbn a buscar
+                            se ignoran todos los signos '-'
+
+        """
+
+        isbn = isbn_prefix.replace("-", "") + "*"
+
+        super(QA_ISBN, self).__init__(maxitems)
+
+        self.q.update({
+            "params.cisbnExt": isbn,
+
+            "params.reLenguas.lenguaPublicacionFormId": publanguage,
+            "params.reAnnoPublica.annoDesde": year1,
+            "params.reAnnoPublica.annoEntre": year2,
+        })
+
+class QA_IBIC_ISBN(QueryArgs):
+
+    def __init__(self, materia, isbn_prefix,
+                 year1="", year2="",
+                 maxitems=50, publanguage="Castellano"):
+        """
+        Búsqueda por ISBN.
+
+        :materia:    índice de materia
+        :isbn_prefix:       inicio del código isbn a buscar
+                            se ignoran todos los signos '-'
+
+        """
+
+        isbn = isbn_prefix.replace("-", "") + "*"
+
+        super(QA_IBIC_ISBN, self).__init__(maxitems)
+
+        self.q.update({
+            "params.cisbnExt": isbn,
+
+            "params.liConceptosExt[0].indices": materia,
+            "params.liConceptosExt[0].concepQueryFormIdExt": "4",  # MATERIA
+
+            "params.reLenguas.lenguaPublicacionFormId": publanguage,
+            "params.reAnnoPublica.annoDesde": year1,
+            "params.reAnnoPublica.annoEntre": year2,
+        })
+# -*- coding: utf-8 -*-
+"""
+Created on Thu May 08 14:43:17 2014
+
+@author: jmcortesa
+"""
+
+
+from functools import partial
+import codecs
+
+
+# Para leer ficheros en utf-8 y latin1
+openutf8 = partial(codecs.open, mode="rU", encoding="utf-8")
+openlat1 = partial(codecs.open, mode="rU", encoding="latin1")
+
+
+def to_unicode(txt):
+    """
+    Convierte de str a unicode
+    """
+    return txt.decode("utf8") if not isinstance(txt, unicode) else txt