Sélectionner une page

Je vais vous exposer une méthode de recherche de données en masse pour alimenter les bases de données de vos futurs sites webs.

Savoir présenter les données et organiser le contenu : c’est bien ce que favorise Google. L’argent que vous gagnez au travers des publicités google adsense n’est finalement qu’une récompense pour avoir organisé le contenu et aidé Google à présenter des infos au Monde.

Il existe différentes méthodes pour recueillir des données. Elles sont partout. Le scraping web permet de récupérer beaucoup de données, mais il nécessite éventuellement de connaître un peu Python pour faire des scrapers, avec la librairie Beautifulsoup ou encore Scrapy. On pourrait aussi se conncter à diverses API mais il faut savoir un peu de code. Alors voilà quelque chose de plus simple.

Wikidata est une base de données gigantesque et ouverte

Tout le monde connaît Wikipédia, le fameux site sur lequel on tombe à chaque recherche un peu informationnelle. Ou encore le site d’autorité vers lequel tout le monde fait un lien dans ses articles.

Wikidata est peut-être un peu moins connu du grand public. C’est une immense base de données opensource.

Voilà la page d’accueil https://www.wikidata.org/wiki/Wikidata:Main_Page. Vous y trouverez l’histoire.

Le Wikidata repose sur un modèle données liées ou Linked Data Model théorisé par Tim Berners-Lee l’inventeur du Web. Ce modèle fonctionne selon un triplet d’information : Un Item + Une property + Une property value.

Par exemple :

  • Item = Strasbourg
  • Property = coordonnées gps
  • Property value = 48.573333333333 N, 7.7522222222222 E

Tout simplement Strasbourg a pour coordonnées GPS 48.573333333333 N, 7.7522222222222 E

Grâce à cette logique vous allez pouvoir vous construire des bases de données à volonté à partir des données publiques.

Comment faire une requête sur Wikidata en utilisant Sparql ?

Le Sparql

On va faire un exemple pour que vous compreniez plus vite comment cela fonctionne.

Pour commencer il faut savoir où faire les requêtes Sparql et obtenir les data en retour. Ca se passe ici https://query.wikidata.org/

Vous allez pouvoir y constuire des requêtes un peu en mode SQL mais pas tout à fait. SPARQL c’est le SQL du web.

Pour notre exemple on va extraire tous les joueurs de basket de nationalité française, leurs poids et tailles respectives.

Une requête commence par SELECT et le nom de ce qu’on veut avec un point d’interrogation juste avant (on choisir un nom) par exemple : SELECT ?joueur

Puis on va mettre des conditions. En l’occurence on veut qu’ils soient :

  1. Des joueurs de basket : le plus rapide c’est d’aller sur cette page et de rechercher un joueur de basket français au hasard, disons Evan Fournier. On arrive sur cette page https://www.wikidata.org/wiki/Q2504840. Il va falloir qu’on spécifie à la requête une propriété et une valeur de propriété pour qu’elle nous renvoie l’objet qu’on veut (ici les joueurs de baskets FR). Dans ce cas la propriété c’est l’activité pro et la valeur de propriété c’est joueur de basket. Sur la page, on voit qu’il y a le terme « occupation » et que la valeur est basketball player. On se met avec la souris sur le terme occupation et obtient le code de propriété P106. Pareil pour Basketball player, et on obtient Q3665646.

2. De nationalité française. La Nationalité est une propriété, et la nationalité française est une valeur de propriété. De la même manière on a P27 pour country of citizenship et Q142 pour la France

on parle comme ça dans la requête. la property se met après wdt: et la value après wd: et on finit par un point.

Voilà la requête

SELECT ?joueur

WHERE{

  ?joueur wdt:P106 wd:Q3665646 .
  ?joueur wdt:P27 wd:Q142 .
  
  
}

Et cela nous renvoie 1317 joueurs, mais le problème c’est que ce sont des liens d’objets qui commencent par Q….

Mais nous on veut des noms ! Donc il faut qu’on demande le Label.

On modifie alors la requête, et tout en haut on demande le ?joueurLabel avec la majuscule à Label sinon ça ne marche pas. Et pour cela il faut aussi qu’on appelle le service de Label avec la ligne de code suivante :

  SERVICE wikibase:label { bd:serviceParam wikibase:language "fr" . }      

au final la requête ressemble à ça :

SELECT ?joueur ?joueurLabel

WHERE{

  ?joueur wdt:P106 wd:Q3665646 .
  ?joueur wdt:P27 wd:Q142 .
  
    SERVICE wikibase:label { bd:serviceParam wikibase:language "fr" . }      
  
}

Maintenant on a les noms 🙂

Pour aller au bout de l’exemple maintenant il nous faut les poids et les tailles !

Il faut d’abord qu’on recherche les codes de propriété : on retourne sur la page d’Evan Fournier.

On trouve : mass P2067 et height P2048

Donc on va modifier notre requête pour dire qu’à partir de l’objet joueur de basket, et les propriétés poids et taille, maintenant on veut les valeurs de ces deux dernières propriétés.

on ajoute ?poids et ?taille dans le SELECT

Et dans le WHERE on indique les propriétés.

Voilà la requête :

SELECT ?joueur ?joueurLabel ?Poids ?Taille

WHERE{

  ?joueur wdt:P106 wd:Q3665646 .
  ?joueur wdt:P27 wd:Q142 .
  ?joueur wdt:P2048 ?Taille .
  ?joueur wdt:P2067 ?Poids .
  
    SERVICE wikibase:label { bd:serviceParam wikibase:language "fr" . }      
  
}

Et Wikidata nous sort les tailles et poids. Bien sûr tous les joueurs n’ont pas les infos remplies ! Sur les 1317 joueurs de base on obtient 290 joueurs qui ont les deux champs remplis.

Par contre il y en a 581 qui ont la taille indiquées, mais comme on demande les deux il sort uniquement ceux qui ont les deux champs remplis.

On trouve d’ailleurs avec ce jeu de données que le basketteur le plus grand est Vincent Pourchot avec 2,22 m !!! Le plus grand basketteur de l’histoire du basket français.

Je précise aussi qu’on demande une taille et un poids, mais si on avait demandé quelque chose de plus complexe, le système nous aurait sorti des objets. Il aurait alors fallu demander le Label.

Par exemple si on demande le lieu de naissance de ces joueurs, on va obtenir le résultat suivant dans lequel on voit que la dernière colonne nous renvoie des objets en Q….

Pour afficher les villes de naissance il suffit de rajouter Label en haut collé à notre nom de variable, comme dans la requête ci-dessous :

SELECT ?joueur ?joueurLabel ?Poids ?Taille ?LieuNaissanceLabel

WHERE{

  ?joueur wdt:P106 wd:Q3665646 .
  ?joueur wdt:P27 wd:Q142 .
  ?joueur wdt:P2048 ?Taille .
  ?joueur wdt:P2067 ?Poids .
  ?joueur wdt:P19 ?LieuNaissance .
  
    SERVICE wikibase:label { bd:serviceParam wikibase:language "fr" . }      
  
}

Et voilà le résultat

Il ne nous reste qu’à télécharger les données sous format souhaité : JSON TSV CSV HTML SVG

On peut maintenant le mettre en base de données et faire des requêtes sur ces données pour alimenter un site web par exemple.

Si vous voulez éviter de taper du code il existe un site qui vous construit la requête : à partir des propriétés et des valeurs. Rendez-vous ici : https://query.wikidata.org/querybuilder/?uselang=fr

Astuces supplémentaires :

  • Depuis une page Wikipédia classique, vous avez un lien sur la gauche qui vous emmène vers l’objet Wikidata. Vous pourrez y trouver facilement les Prop et value recherchées.
  • Pour copier les valeur de props et de values, P…et Q…., faites simplement Clic Droit + Inspecter dans Chrome, et vous aller retrouver la valeur dans le code dans l’attribut title de la balise a.

Sources

  • Tuto Sparql Wikidata : https://wdqs-tutorial.toolforge.org/index.php/introduction/the-structure-of-wikidata/
  • Tout sur le Wikidata et comment faire des requêtes : https://www.wikidata.org/wiki/Wikidata:SPARQL_query_service/Wikidata_Query_Help
  • Exemples de requêtes pour l’inspiration : https://www.wikidata.org/wiki/Wikidata:SPARQL_query_service/queries