#!/usr/bin/python # coding: utf-8 ''' scraper-citation-celebre.py Version 2019-11-07 Récupère des citations de http://www.citation-celebre.com/liste-citation et créé un fichier compilable par fortunes (sous Linux) Une fois ce script terminé, faire: strfile citation-celebre.com Cela va créer le fichier citation-celebre.com.dat et copier les deux fichiers : sudo cp citation-celebre.com* /usr/share/games/fortunes Ce script est interruptible à tout moment. Vous pouvez l'arrêter et le relancer: Il reprendra là où il en était. ''' import lxml.html,requests,codecs,sys,UserDict,os,os.path from sqlite3 import dbapi2 as sqlite class dbdict(UserDict.DictMixin): ''' dbdict, a dictionnary-like object for large datasets (several Tera-bytes) ''' def __init__(self,dictName): self.db_filename = "dbdict_%s.sqlite" % dictName if not os.path.isfile(self.db_filename): self.con = sqlite.connect(self.db_filename) self.con.execute("create table data (key PRIMARY KEY,value)") else: self.con = sqlite.connect(self.db_filename) def __getitem__(self, key): row = self.con.execute("select value from data where key=?",(key,)).fetchone() if not row: raise KeyError return row[0] def __setitem__(self, key, item): if self.con.execute("select key from data where key=?",(key,)).fetchone(): self.con.execute("update data set value=? where key=?",(item,key)) else: self.con.execute("insert into data (key,value) values (?,?)",(key, item)) self.con.commit() def __delitem__(self, key): if self.con.execute("select key from data where key=?",(key,)).fetchone(): self.con.execute("delete from data where key=?",(key,)) self.con.commit() else: raise KeyError def keys(self): return [row[0] for row in self.con.execute("select key from data").fetchall()] pagecache = dbdict('pages-citations') file = codecs.open("citation-celebre.com", "w", "utf-8") npage = 1 def cleanString(s): return s.replace("\t",' ').replace("\r\n",' ').replace("\r",' ').replace("\n",' ').replace(' ',' ') while npage < 8069: url = u'http://www.citation-celebre.com/liste-citation?page=%d' % npage if url not in pagecache: sys.stderr.write("Récupération page %d... \n" % npage) page = requests.get(url) pagecache[url]=page.content.decode('utf-8') pagedata = pagecache[url] tree = lxml.html.fromstring(pagedata) citations = tree.xpath('//div[@class="citation"]') for citation in citations: # Extraction des citations de la page: texte = citation.xpath('.//p[@class="laCitation"]/q/a')[0].text_content().strip() auteur = "" # Attention l'auteur peut être vide. auteurElement = citation.xpath('.//div[@class="auteur"]//div[@class="additionalInformation"]//a[@class="auteurLien"]') if auteurElement : auteur = cleanString(auteurElement[0].text_content().strip()) # Écriture dans le fichier. if u"► Lire la suite" in texte: continue # On zappe les citations trop longues. file.write("%s\n" % texte) if len(auteur)>0: file.write(" -- %s\n" % auteur) file.write("%\n") npage += 1 file.close()