Outils pour utilisateurs

Outils du site


fortunes-maker

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
Dernière révisionLes deux révisions suivantes
fortunes-maker [2016/04/08 10:07] – [Source potentielles (à explorer/aspirer)] sebsauvagefortunes-maker [2019/11/07 13:12] – [Le programme] sebsauvage
Ligne 1: Ligne 1:
 ====== fortunes-maker ====== ====== fortunes-maker ======
- 
-<note important>**PAGE EN COURS DE CONSTRUCTION**</note> 
  
 Sous Linux, //fortunes// est un petit programme en ligne de commande qui affiche des citations. On s'en sert souvent pour en afficher quand on ouvre un nouveau terminal, ou encore en économiseur d'écran (l'économiseur d'écran //[[https://www.youtube.com/watch?v=G6ZWTrl7pV0|Phosphor]]// dans //[[https://www.jwz.org/xscreensaver/|xscreensaver]]//). Sous Linux, //fortunes// est un petit programme en ligne de commande qui affiche des citations. On s'en sert souvent pour en afficher quand on ouvre un nouveau terminal, ou encore en économiseur d'écran (l'économiseur d'écran //[[https://www.youtube.com/watch?v=G6ZWTrl7pV0|Phosphor]]// dans //[[https://www.jwz.org/xscreensaver/|xscreensaver]]//).
Ligne 12: Ligne 10:
 Mais le fichier de fortunes francophone a été mis à jour pour la dernière fois [[https://www.fortunes-fr.org/#news|en 2004]]. C'est dommage. Mais le fichier de fortunes francophone a été mis à jour pour la dernière fois [[https://www.fortunes-fr.org/#news|en 2004]]. C'est dommage.
  
-Alors voici un ensemble de scripts Python qui construisent de nouveau fichier //fortunes// à partir de divers sites web.+J'ai décider de scraper le site //citation-celebre.com// pour construire un nouveau fichier de fortunes. 
 + 
 +===== Nouvelle citations ===== 
 + 
 +Voici donc un nouveau fichier de //fortunes// contenant plus de 80 000 citations en français. 
 + 
 +<note important>Fichier de citations en cours de reconstruction.</note> 
 + 
 +==== Installation ==== 
 + 
 + 
 +  - Récupérez le fichier: http://sebsauvage.net/files/fortune/citation-celebre.7z (2 Mo, md5 4bf707f4d4a1af8457834d8578699a52) et décompressez-le.  
 +  - Virez les citations existantes si vous le souhaitez: ''sudo rm -rf /usr/share/games/fortunes/*'' 
 +  - Copiez ces nouvelles citations: ''sudo cp citation-celebre.com* /usr/share/games/fortunes'' 
 +  - Et voilà, vous pouvez profiter des citations: ''fortune'' 
 +===== Le programme ===== 
 + 
 +Vous pouvez lancer le programme suivant pour scraper vous-même les citations sur le site, mais je vous demande, si c'est possible, d'éviter. De préférence, utilisez le fichier de citation que j'ai déjà créé. Cela évitera de charger inutilement le site web. 
 + 
 +<hidden Cliquez pour afficher le programme> 
 +<file python scraper-citation-celebre.py> 
 +#!/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() 
 +</file> 
 +</hidden> 
 + 
 +\\
  
 +Voir aussi: https://sebsauvage.net/links/?gKjK1A