Web scraping avec Excel et Power Query

Depuis longtemps déjà, Excel permet de récupérer le contenu de tables sur des sites web. Une fonction qui a été améliorée sous Excel 2016. Et que dope encore Power Query.

 Excel, dans sa dernière version et avec ses dernières mises à jour, permet facilement d’extraire des tables. Grâce à Power Query, ce scrapping peut aussi être incrémenté, c’est-à-dire que la récupération des données peut se faire automatiquement de page en page.

Récupérer les données d’une table sur un site web

Il s’agit, dans cet exemple, de récupérer la liste des donateurs de la Fondation Clinton. Disons ceux qui, moyennement généreux, ont versé de 5000 à 1000 USD à la fondation de l’ancien président. La page d’accueil est ici.

Nous voyons donc une liste de donateurs. Plus précisément, les 50 premiers noms sur 1442 occurrences.

L’extraction d’une table est simple : copiez l’url de la page web où se trouve la table puis dans Excel, Données/A partir du web. Et collez l’url :

Choisissez la bonne table (ici, la Table 0) en vous appuyant sur la prévisualisation et en bas de la fenêtre de dialogue, cliquez sur « Charger ».

La table est ainsi automatiquement chargée dans votre feuille Excel sous la forme d’un tableau.

Notez que cette importation nécessite que les tables soient bien structurées, ce qui est par exemple le cas de celles que l’on trouve sur Wikipedia. Quelques clics de souris permettent ainsi d’importer le plus facilement et proprement du monde la liste des présidents US, celle des principaux maires de France ou en Belgique, celle des membres du Parlement fédéral.

Incrémenter le scrapping

Mais comment faire si on veut récupérer automatiquement les noms de tous les donateurs de a Fondation Clinton? Autrement dit, naviguer de page en page jusqu’au 1442e nom et tout renvoyer dans une feuille Excel ?

La première page de cette liste a déjà été récupérée, passons donc à la page 2/29 de cette même liste :

Et jetons un coup d’oeil à l’url de cette seconde page :

https://www.clintonfoundation.org/contributors?category=%245001%20to%20%2410%2C000&page=1

On le voit, dès cette seconde page, les url sont numérotées (en gras ci-dessus). On incrémentant manuellement l’url (en remplaçant page=1 par page=2, page=3, etc…) on passera d »‘une page à l’autre. Jusque page=28, qui marque la fin de la liste.

Bon, retour à la seconde page, dont on copie l’url. Puis Données/A partir du web et collage de l’url. 

Sélection de la Table 0 avec prévisualisation :

Puis cette fois, il faut cliquer sur « Modifier » plutôt que « Charger » afin d’ouvrir l’éditeur de requêtes.

Allez encore plus loin en activant l’éditer avance (sur la gauche du ruban ) :

Et voici le code de votre requête :

Le langage des requêtes de Power Query s’appelle M. Deux fonctions ont ici été automatiquement activées : Web.Contents pour désigner l’url qui a été appelée et Web.Page pour spécifier qu’il s’agit d’une page web. Il est aussi précisé que sur cette page, c’est de la Table 0 dont on a besoin.
On voit aussi que l’url contient le numéro de la page  (page=1), numéro que l’on va transformer en paramètre pour pouvoir aller de page en page.

Pour ce faire, il faut introduite cette ligne

(page as number) as table =>

au début du code afin de spécifier que le numéro qui suite le mot « page » va changer et permettre de charger de nouvelles tables.

Nous allons aussi insérer la fonction Number.ToText pour convertir en texte la valeur qui sera renseignée (numéro de la page) et reconstruire automatiquement les url.

Ce qui donne, dans l’éditeur, ce code :

(page as number) as table =>

let
 Source = Web.Page(Web.Contents("https://www.clintonfoundation.org/contributors?category=%245001%20to%20%2410%2C000&page=" & Number.ToText(page) & "")),
 Data0 = Source{0}[Data]
in Data0

On valide et la fonction est mise en oeuvre, il est désormais possible d’appeler un numéro de page :

Si on appelle la page 7, celle-ci s’affiche effectivement :

  Supprimez d’un clic droit la Fonction appelée puis, en cliquant sur Table 0 pour l’activer, changer son nom. Appelez-la par exemple Data.

Lorsque c ‘est chose faite, fermez et chargez pour revenir à la feuille de calcul

 

Reste maintenant à incrémenter les pages.

A partir de la même feuille de calcul, Données/Obtenir des Données/A Partir d’autres Sources/Requête vide

Dans la barre de formules, nous allons indiquer que le scrapping devra couvrir les pages 1 à 28 :

= {1..28}

Ce qui donne, une fois la formule validée avec la touche Enter :

Dans le ruban, cliquez sur le bouton « Vers la table » puis validez et cette liste ce transforme en table. Et en double-cliquant sur son en-tête, renommez-la. Par exemple en « Data ».

Dans le menu supérieur, sélectionnez « Ajouter une colonne » puis dans le ruban, « Colonne personnalisée ».

Dans la boîte de dialogue qui apparaît, appelez la fonction d’incrémentation avec la formule

Data([Data])

 

Puis validez, une seconde colonne vient d’être créée :

Etendez la nouvelle colonne en cliquant sur l’icône à côté de son nom puis validez par Ok:

En revenant à Accueil sur le ruban puis à « Fermer et Charger », vous revenez à la feuille de calcul. Tous les noms de donateurs y figurent désormais.