Voici la description d’un sous-projet de On the Shoulders of Cloud Giants. Il s’agit de moissonner (ie. web scraper, récupérer et organiser certaines données du web de manière automatisée) les blogues qui parlent de jeux de rôle sur table pour identifier qui cite qui.
Les codes sont en Python et ils utilisent des libraries courantes. Ils se trouvent ici : https://github.com/pmartinolli/pyTTRPGblogScraping
Visualisation du résultat en JavaScript : https://observablehq.com/@pascaliensis/ttrpg-blog-communities-who-cites-who
Les fichiers de programme .py sont installés dans un répertoire. Les fichiers produits (.csv et .txt) sont écrits dans le répertoire parent du répertoire des programmes.
Fonctionnement de la moissonneuse
Nom du programme : pyTTRPGblogCitationWS.py
- On fournit une liste de blogues pour démarrer le moissonnage. Ce sont des URLs (une par ligne) dans un fichier
manual_urls.txt
- Le programme parcourt les URLs et produit un fichier
blog_urls_iteration_1.csv
- Il contient l’URL du blog citant, l’URL du blog cité et les mots-clés contrôlés trouvés dans le blogue citant.
- Le processus peut être interrompu en tout temps et relancé. Le prochain fichier sera nommé
blog_urls_iteration_2.csv
et ainsi de suite. C’est très pratique car parfois (souvent?) le processus bloque sur certaines URLs. Il faut alors redémarrer le kernel de Python et relancer le programme. - Un blogue citant qui a été analysé une fois ne l’est plus par la suite.
- Pour automatiser l’insertion d’une nouvelle entrée dans le fichier csv, il faut que le blogue citant ET le blogue cité :
- Soient chacun de type “blogue” (plusieurs techniques sont utilisées)
- Parlent de jeu de rôle sur table (liste de mots-clés contrôlés à repérer sur la page d’accueil du blogue, à l’exclusion du texte des liens). Les mots-clés contrôlés sont dans le code dans une liste nommée
rpg_keywords
- Mécanismes d’exclusion
- À l’intérieur du code, il y a la possibilité d’alimenter une liste nommée
url_traps
avec les URLs qui ont fait boguer le programme. - Pour éviter de tester des URLs qui ont déjà été évaluées et rejetées (ni blogue, ou blog non JDR, ou erreurs), une liste d’exclusion est stockée dans une variable
exclusion_list_urls
et dans un fichier texte nomméexclusion_list.txt
. C’est le premier test quand une nouvelle URL doit être évaluée. Cela accélère considérablement le programme.
- À l’intérieur du code, il y a la possibilité d’alimenter une liste nommée
Nettoyage du fichier de résultat
Nom du programme : pyTTRPGblogCleaner.py
Tout fichier doit être nettoyé avant d’être utilisé par un programme d’analyse ou de visualisation. Or le fichier généré par la moissonneuse est tout spécialement chevelu et hirsute.
Fonctionnement principal :
- Il supprime les indicatifs .com, .fr, etc.
- Il supprime les lignes doublons et les auto-citations qui auraient pu se glisser (citant = cité)
- Il supprime les “non blogues de JDR”
- Il renomme la colonne
Citing...
enSource
et la colonneCited...
enTarget
(car c’est souvent ce qu’attendent certains programmes comme GEPHI). - Un fichier
clean_citing_cited_TTRPG_blog_list.csv
est produit.
Et ensuite ?
Visualiser et analyser les données
(à venir dans un prochain billet)
Citation fine
Utiliser les URL testées positives pour archiver tous les billets de tous les blogues retenus (lorsque leurs auteurs autorisent le moissonnage). Puis utiliser ces billets archivés pour faire une analyse plus fine des citations.
-
- En effet, avec la méthode actuelle les liens de citation sont principalement ceux dans le bandeau actuel de navigation du blogue, avec peut être une dizaine de billets les plus récents.
- En analysant les citations dans chaque billet on a un maillage plus fin des relations puisque ces citations sont localisées sur des informations spécifiques plutôt qu’être mentionnées de manière générique dans la zone de navigation.
- On pourra peut être même comparer les deux types de citation.
- Il y a un aspect préservation aussi car on ne sait pas si Google ou d’autres plateformes de blogue fermeront leurs services.
Annexe : extraire les URLs de départ depuis Obsidian
J’avais stocké des centaines d’URL dans des notes Obsidian.md. Voici un programme qui parcourt un coffre (vault) Obsidian.md et qui créé le fichier manual_urls.txt
pour démarrer le programme de moissonnage.
Nom du programme : pyURLfromObsidianMD.py
Auto-réflexions en cours de projet (20240624)
- Le web scraping est vraiment un processus fragile. Souvent, j’ai corrigé le code pour éviter que ça plante. Maintenant, ça roule mieux (du moins pas de plantage en 24h non-stop) mais c’est lent. J’ai produit 33 000 paires en 72h dans un fichier csv qui fait 3.8 Mo. Je pensais que ça irait plus vite.
- J’ai fait l’erreur de créer/mettre à jour les fichiers sur un infonuage. Cela était sûrement une des raisons du plantage et des couacs divers. Maintenant, tout tourne sur le disque dur mais non synchronisé. À noter pour l’application de la méthode file over app : en cas de mise à jour intensive de fichiers, les infonuages sont à éviter.
- Émotionnellement, c’est super satisfaisant de s’endormir ou de partir en randonnée et de savoir que le code tourne tout seul et produit des choses en notre absence.
- Plus généralement, le fait de chercher «qui cite qui» dans ce contexte permet de mettre un peu d’ordre dans le chaos des blogues existants. A part utiliser des recommandations ou des listes sélectionnées de blogues, il n’y a aucun moyen de mesurer l’impact, l’étendue, la forme, etc. des communautés de rôlistes blogueurs.
- J’ai hâte d’assister à un pic d’URL à chercher (pour l’instant ça ne fait que monter) pour avoir l’impression d’avoir fait le tour. Bien que je sais que ce soit un peu illusoire car beaucoup de blogues :
- refusent d’être moissonnés,
- ou bien ils ont disparu,
- ou bien mon code ne sait pas les identifier. Cette dernière catégorie est particuli`èrement déchirante car c’est ce qui arrive pour les sites web “maison”. Or les blogues ayant souvent une valeur fortement DIY, cela écarte tous les blogues vraiment DIY et donne un biais de sélection aux blogues qui ont choisi des plateformes “mainstream” pré-construite comme WordPress ou Blogger. Exemple : https://ludomancien.com/
- Il faudra que je repasse sur certaines adresses (et que je revois mes critères de
rpg_keywords
) car je vois qu’elles sont écartées par erreur. Je me baserai sur les adresses les plus citées et celles qui ont été classées comme Non-blogue de JDR.- NB: je pense savoir pourquoi: à un moment donné, il y a eu un problème de connexion sur certains blogues qui se sont retrouvés dans la liste d’exclusion. Il faudra donc retraiter toute la liste d’exclusion à la fin.
Auto-réflexions II (20240702)
- J’ai abandonné l’idée de réinjection continue des URL citées en URL citantes.
- D’abord, je fais une passe complète sur le premier jeu d’URL. Puis quand c’est terminé, je me base sur les URL citées pour constituer le second jeu d’URL.
- Auparavant, la constante réinjections des URL citées faisait que le processus entrait en profondeur dans certaines explorations et ainsi créait un énorme biais.
- J’utilise le programme
pyTTRPGblogCitationIterationX.py
pour extraire les URL de l’itération finale de la première phase.
La visualisation ci-dessus a été faite avec le logiciel open source Gephi. Open > Spreadsheet > Ouvrir le fichier clean_citing_cited_TTRPG_blog_list.csv
qui contient 12000 arêtes (edges) et 4700 noeuds (nodes). Ça produit un gros carré. Aller dans le panneau Layout > —Choose a layout > OpenOrd > RUN