Comment j’ai fouillé dans des dizaines de milliers de notices Wikipédia

Pour réa­li­ser le Top 50 des sites d’info les plus cités sur Wiki­pe­dia, j’ai uti­li­sé une série d’outils dont je m’étais par­fois déjà ser­vi dans d’autres pro­jets :

  • J’ai repé­ré des séries de notices inté­res­santes grâce à l’outil CatS­can pro­po­sé par Wiki­pé­dia.
  • J’ai uti­li­sé des tech­niques de data scra­ping pour par­cou­rir auto­ma­ti­que­ment des mil­liers de notices avec l’extension Fire­fox Out­wit Hub.
  • J’ai net­toyé les résul­tats obte­nu grâce à Open Refine.
  • J’ai dres­sé les clas­se­ments avec Google Sheets, le tableur de Google Drive.
  • J’ai réa­li­sé les gra­phiques avec Data­wrap­per.
  • J’ai pré­sen­té les tableaux de façon inter­ac­tive avec le plug-in JQue­ry Data­tables.

Comme cha­cun de ces ser­vices peut vous inté­res­ser, je reviens pas à pas dans cet article sur la méthode uti­li­sée, en don­nant des liens vers les fichiers de don­nées obte­nues.  N’hésitez pas à réuti­li­ser ces der­nières pour d’autres tra­vaux, et tenez-moi au cou­rant de vos trou­vailles dans les com­men­taires.

A plu­sieurs reprises, j’ai fait des choix qui m’ont sem­blé cohé­rents avec l’objectif de ce pro­jet. Que vous soyez wiki­pé­dien ou jour­na­liste, vous aurez sans doute envie de les dis­cu­ter, ce que je vous encou­rage for­te­ment à faire, je suis là pour ça.

1. Bâtir un échantillon avec CatScan

La pre­mière dif­fi­cul­té, c’était de trou­ver une série de notices Wiki­pé­dia per­ti­nentes.

J’ai d’abord pen­sé à pro­gram­mer Out­wit Hub pour en col­lec­ter de façon tota­le­ment aléa­toires, en uti­li­sant par exemple le lien « Explo­rer au hasard » de l’encyclopédie. Mais mon « robot » s’est vite per­du dans des fiches sans lien avec l’actualité ou dans diverses pages de listes.

J’ai alors décou­vert CatS­can et je m’en suis ser­vi pour obte­nir les liens de notices figu­rant dans toute une série de caté­go­ries et sous-caté­go­ries. En par­tant la caté­go­rie Eve­ne­ment de Wiki­pé­dia, j’ai sélec­tion­né les sous-caté­go­ries sui­vantes (elles-mêmes divi­sées en une mul­ti­tude de sous-caté­go­ries :

  • Evé­ne­ment en cours
  • Evé­ne­ment à venir
  • Evé­ne­ment récent
  • Jour­née com­mé­mo­ra­tive ou thé­ma­tique
  • Mas­sacre
  • Evé­ne­ment his­to­rique en météo­ro­lo­gie
  • Salon
  • Marche
  • Contro­verse
  • Fes­ti­val

CatS­can m’a ren­voyé une liste de 16741 notices (sur un total de plus de 1,6 mil­lion publiés sur la Wiki­pé­dia en fran­çais, soit envi­ron 1%) sur des sujets très variés. La taille de cette liste m’a paru suf­fi­sante – au-delà, les dif­fé­rents logi­ciels dont je me suis ser­vi n’aurait de toute façon pas pu fonc­tion­ner cor­rec­te­ment.

2. Programmer un scraper avec Outwit Hub

Bien que l’interface de ce logi­ciel de scra­ping soit inti­mi­dante (euphé­misme), Out­wit Hub n’est pas si com­pli­qué à uti­li­ser, une fois qu’on a digé­ré les tuto­riels de base. Il suf­fit d’identifier où se trouvent dans le code source les infor­ma­tions qu’on recherche et com­ment elles sont struc­tu­rées en lan­gage HTML.

En l’occurrence, les liens se trou­vant dans les par­ties qui m’intéressaient («Notes et réfé­rences » et « Voir aus­si » notam­ment) sont dans des balises liens («a») por­tant la classe CSS « exter­nal text ».

Capture d’écran 2014-09-10 à 19.16.20
Cap­ture d’écran de Out­wit Hub

Il suf­fit alors de créer un « extrac­teur »,en indi­quant à Out­wit Hub les chaînes de carac­tères se trou­vant juste avant et juste après l’information ciblée.  Par exemple, pour l’URL externe :

<a class="external text" href="

et

">

Pour extraire plu­sieurs infor­ma­tions à la fois (l’URL, mais aus­si le nom de domaine et le texte du lien), j’ai cepen­dant dû construire une expres­sion régu­lière. Sans vous faire un cours com­plet sur ces trucs-là (ce dont je serais bien inca­pable), sachez qu’on les croise un peu par­tout (de Yahoo Pipes à Adobe Inde­si­gn en pas­sant par les dif­fé­rents lan­guages de pro­gram­ma­tion).

Pour un non-déve­lop­peur, c’est un peu pénible à apprendre, mais ça rend bien des ser­vices, ça en vaut donc la peine.  Après avoir pas mal trans­pi­ré, j’ai fini par bâtir l’expression sui­vante (sûre­ment per­fec­tible, d’ailleurs) :

/class="external text".*href="(http://.*?)(/.*?)">(.*?)</a>/

Out­wit Hub était alors paré pour le moment le plus agréable du pro­jet, celui où l’ordinateur tra­vaille à votre place : il a suf­fit de lui deman­der de pas­ser cet extrac­teur sur chaque page de l’échantillon, puis d’exporter tous les résul­tats obte­nus dans un gros fichier CSV (20 Mo).

3. Nettoyer les résultats avec Open Refine

Quand vous sou­hai­ter inter­ve­nir sur de gros fichiers de don­nées, les fonc­tion­na­li­tés les plus cou­rantes (comme Recher­cher / Rem­pla­cer) ne suf­fisent pas.

C’est là qu’Open Refine (ancien­ne­ment Google Refine) se révèle par­ti­cu­liè­re­ment utile, parce qu’il per­met de faire via une inter­face gra­phique très bien fichue des mani­pu­la­tions de tables qui doivent se faire sinon via des lignes de com­mande.

Là encore, il faut accep­ter de se plon­ger dans les tuto­riels et les pages d’aide pour apprendre à effec­tuer les opé­ra­tions sou­hai­tées, mais c’est du temps bien inves­ti, croyez-moi.

Dans le cadre de ce pro­jet, je me suis ser­vi de Google Refine pour pré­sen­ter pro­pre­ment chaque don­née dont j’avais besoin :

  • l’URL de la notice Wiki­pé­dia « scra­pée »
  • l’URL du lien externe repé­ré
  • le nom de domaine du lien externe repé­ré (par exemple, slate.fr)
  • le texte du lien (sou­vent le titre de l’article)

J’ai aus­si répar­ti ces noms de domaines en deux caté­go­ries : « Actu » et « Autres » (pour tous les liens vers des sites annuaires, ins­ti­tu­tion­nels, ou per­son­nels).

C’était l’étape la plus fas­ti­dieuse : pour évi­ter d’y pas­ser la jour­née et de faire plan­ter Open Refine, je me suis limi­té aux médias cités au moins 30 fois dans l’échantillon.

Cer­tains sites dans cette liste avaient un sta­tut ambi­gu : j’ai conser­vé ceux pro­po­sant à la fois des articles et des sta­tis­tiques ou pages de réfé­rence (par exemple, Allo­ci­né), et d’exclure les purs annuaires (comme IMDB).

J’ai aus­si pra­ti­qué quelques regrou­pe­ments, pour les sites pos­sé­dant plu­sieurs sous-domaines (par exemple, en fusion­nant les liens vers www.lefigaro.fr et elections.lefigaro.fr en lefigaro.fr).

Si ça vous inté­resse d’explorer vous aus­si ces don­nées, vous pou­vez télé­char­ger l’intégralité des liens de l’échantillon ou l’intégralité des liens vers des sites de médias dans des fichiers CSV désor­mais net­toyés.

4. Dresser les classements avec Google Sheets

On approche du but : en impor­tant le CSV conte­nant tous les liens vers des sites de médias dans une feuille de cal­cul Google Sheets, il ne reste plus qu’à créer un rap­port de tableau croi­sé dyna­mique char­gé de comp­ter le nombre de liens pour chaque nom de domaine.

Cette infor­ma­tion est éga­le­ment dis­po­nible dans Open Refine, mais j’avais besoin d’une pré­sen­ta­tion par cel­lules pour pou­voir en faire un gra­phique dans la fou­lée.

(Je n’ai jamais vrai­ment com­pris com­ment fonc­tion­naient vrai­ment ces rap­ports, et je suis bien embê­té quand je dois expli­quer leur fonc­tion­ne­ment lors de for­ma­tions. Je me contente d’essayer diverses com­bi­nai­sons de lignes, de colonnes et de valeurs pour obte­nir le résul­tat sou­hai­té, ce qui finit tou­jours par arri­ver à force d’essais.)

5. Faire le graphique avec Datawrapper

Je ne sais pas s’il est pos­sible de tom­ber amou­reux d’un logi­ciel ou d’un ser­vice web, mais si c’est le cas, je dois confier une pas­sion sans doute exces­sive pour Data­wrap­per – selon moi, Mir­ko Lorenz, son pro­gram­meur,  a déjà sa place réser­vée au para­dis des déve­lop­peurs.

Un copié/collé des don­nées de Google Sheets et quelques réglages dans une inter­face mer­veilleu­se­ment bien pen­sée, et zou, le gra­phique est prêt.

6. Un tableau filtrable avec Datatables

A ma connais­sance, il existe peu d’outils acces­sibles pour pré­sen­ter de longues séries de don­nées pro­pre­ment à l’intérieur d’un article. Le plug-in JQue­ry Data­tables fait ça vrai­ment très bien, mais il faut être suf­fi­sam­ment à l’aise en HTML, en CSS et en JQue­ry pour s’en ser­vir.

J’ai donc récu­pé­ré le flux Json du Google Sheet pour bâtir dyna­mi­que­ment le tableau conte­nant les 23 014 liens vers des sites de médias, et acti­vé Data­tables une fois la table ter­mi­née.

7. Des échantillons sur des thématiques

Pour conti­nuer à explo­rer l’encyclopédie, j’ai choi­si des thèmes plus pré­cis et repé­ré des caté­go­ries (et leurs sous-caté­go­ries) de notices por­tant sur le sport, la poli­tique, la Bre­tagne et la BD.

J’ai fait subir le trai­te­ment décrit ci-des­sus aux liens externes ain­si repé­rés (ça va beau­coup plus vite la deuxième fois).

Voi­ci les don­nées récu­pé­rées, éga­le­ment dis­pos dans Google Sheet :

 

Puisque vous passez par là…

J’ai besoin de votre aide : je m’intéresse à la mesure d’audience des médias en ligne (dans Google Analytics, sur Facebook, sur Twitter…) et à ce que les journalistes en font. En participant à ma petite enquête sur le sujet, vous m’aiderez à concevoir de nouveaux services intéressants.

Partager cet article

Lien copié !
C'est nul, je veux de gros boutons colorés !

Partager cet article

On en discute ?