Des députés fédéraux
et du web scraping

Ça faisait un moment que je me cherchais un petit projet personnel sur les députés fédéraux. Rien de bien sérieux. Juste de quoi coder pour m’amuser un peu.

Le résultat: une ligne du temps interactive sur les emplois déclarés par les députés au fil des années!

Surprenant l’implication des agriculteurs en politique avant les années 70, n’est-ce pas? Et la professionnalisation du rôle de député par la suite? Cliquez sur le graphique ci-dessous pour tous les détail!

Comment ai-je réalisé cette amusante infographie? J’ai codé mon propre programme pour extraire les données du site web du Parlement du Canada! Je vous explique ma démarche en détails dans cet article.

#1 Trouver l’information

En cherchant des informations sur les députés fédéraux, je suis tombé sur cette intéressante page web. Lorsque vous choisissez une élection générale (de la première en 1867 jusqu’à la plus récente en 2011), plusieurs détails sont présentés sur chacun des candidats de l’époque.

Historique

Voici à quoi le tout ressemble par exemple pour Calgary-Centre et Calgary-Centre-Nord, lors de l’élection générale de 2011. Comme vous pouvez le constatez, le métier des candidats est indiqué.

Évidemment, nous pourrions demander aux administrateurs du site web de nous envoyer leur base de données directement, mais c’est beaucoup plus amusant d’extraire les données nous-même! Et nul besoin d’attendre après qui que ce soit.

Premier réflexe: jeter un coup d’oeil au code source de la page:

Code source history

Avez-vous remarqué la balise <table> à la ligne 123? Et les balises <tr> et <td> qui suivent?

Elles créent un tableau HTML sur la page web. C’est parfait pour nous! La structure est redondante. Un programme pourra facilement passer au travers et récupérer ce qu’on lui demandera.

Analysons l’url de la page web maintenant:

http://www.parl.gc.ca/About/Parliament/FederalRidingsHistory/hfer.asp?Language=F&Search=Gres&genElection=41&ridProvince=0&submit1=Recherche

Elle est assez simple. Il s’agit en fait d’une requête pour le serveur qui héberge la base de données où se trouve toutes les informations sur les candidats.

Voyez-vous le 41 ? C’est lui qui indique au serveur que vous souhaitez voir les informations relatives à la 41ème élection générale, qui s’est déroulée en 2011.

Que se passe-t-il si vous remplacez le 41 par 40? La page web qui s’ouvre vous donne les informations pour l’élection de 2008, la 40ème élection générale!

Avec une url aussi simple, ce sera du gâteau pour notre programme. Il pourra ouvrir la page web de chaque élection sans problème!

#II Récolter l’information

Puisqu’il y a eu 41 élections entre 1867 et 2011, l’information que l’on cherche à obtenir se trouve sur 41 pages web différentes.

Par conséquent, nous allons commencer par créer un petit programme qui va enregistrer toutes les pages web sur notre disque dur.

J’ai ouvert mon éditeur de texte et j’ai codé un script tout simple en Python pour ce faire. J’ai utilisé le module urllib2 pour ouvrir les pages et le module time pour créer un petit délai.

Tout d’abord, on charge les modules, puis on crée une boucle qui va rouler 41 fois. Ce faisant, on a créé une variable n qui va passer de 1 à 41, au fur et à mesure que la boucle roulera. On peut donc insérer n dans l’url de la page web!

Par la suite, on choisit où l’on souhaite enregistrer la page web. Encore une fois, on peut utiliser la variable n pour le nom même du fichier HTML, qui se retrouvera sur notre disque dur.

Et maintenant, on ouvre la page web, on créé le fichier HTML sur notre ordinateur, et on copie le contenu de la page web dans le fichier HTML avant de le fermer!

À la fin de la boucle,  j’ai ajouté un print statement pour que vous puissiez voir le programme en action dans la fenêtre du terminal. Et aussi un délai d’une seconde, pour ne pas surcharger le serveur du Parlement avec trop de requêtes en même temps!

Une fois arrivé à la fin, le programme retourne au début de la boucle, télécharge la page suivante, et ainsi de suite, 41 fois pour les 41 élections générales. Voici ce que ça donne en action:

 

Tadam! En deux minutes, on vient d’enregistrer 41 pages web!

#III Trier l’information

On a désormais toutes les données sur notre ordinateur. Petit problème: les informations sont éparses et inutilisables pour l’instant.

On doit donc rédiger un deuxième script en Python, qui va passer au travers du code HTML des 41 fichiers que l’on vient d’enregistrer. Ce second programme va extraire les données qui nous intéresse et les placer dans un fichier tout propre, semblable à un fichier csv!

Pour ce faire, j’ai utilisé le module BeautifulSoup pour traiter le HTML et le module Unicodecsv pour créer le fichier final.

Pour commencer, on lance les modules et on créé un fichier texte, qui sera délimité par des tabulations. On en profite aussi tout de suite pour écrire la première ligne, qui sera le nom des différentes colonnes.

Par la suite, on créé une boucle qui passera au travers des 41 fichiers HTML enregistrés sur notre disque dur. Et on les passe un par un dans le module BeautifulSoup, avant de commencer à travailler avec. (La variable counter va nous servir à suivre le processus en action plus tard.)

C’est parti! Maintenant, on peut commencer à extraire les données. Tout d’abord, on isole tout ce qui se trouve entre les balises <tr> (cette balise code les lignes du tableau HTML). Dans le code source de chacune des pages, on peut voir que la deuxième ligne du tableau HTML contient toujours le nom d’une circonscription puis la date de l’élection générale. Vu que la date a toujours le même format, on peut extraire l’année très facilement, en comptant les caractères depuis la droite.

Avez-vous remarqué le petit symbole « ✓ » que l’on retrouve sur la ligne des candidats élus? Un coup d’oeil au code source nous indique qu’il s’agit d’une image codée ainsi: <img src=’images/check.gif’>. C’est parfait pour nous! Tel qu’indiqué dans le code ci-dessous, cela permet de sélectionner directement les candidats élus, donc les députés! On peut désormais isoler chaque cellule du tableau, uniquement pour ceux qui ont gagné les élections.

Tout est en place pour extraire les données! Sur chaque ligne, le nom du candidat se trouve dans la première cellule, à l’index zéro. Par la suite, c’est le parti politique, l’occupation, le nombre de votes et le pourcentage de votes obtenus pour finir. On place chaque information dans une variable.

Parfois, les députés sont élus par acclamation. Dans ce cas là, le check est remplacé par accl. Nous devons donc ajouter une condition à notre script, pour être sûr que l’on aura tout le monde!

Et maintenant, la finale!  On affiche à l’écran toutes les variables pour vérifier ce qu’elles contiennent et on écrit les lignes une à une dans notre fichier texte! J’ai ajouté un print statement avec la variable counter pour que l’on puisse voir le script travailler dans le terminal.

Notre programme va donc ouvrir chaque page web, passer au travers de chaque ligne dans les tableaux HTML, extraire les données qui nous intéressent et finalement les copier dans notre fichier texte. Voici ce que ça donne quand on lance le script:

Et voilà! En moins de quatre minutes, on vient d’extraire les données de 41 fichiers HTML, tout en copiant plus de 10 000 lignes d’information dans un fichier texte! N’est-ce pas fantastique?

Et voici le résultat quand on ouvre le fichier dans un tableur. Un beau fichier tout propre! Il ne reste plus qu’à l’ouvrir dans Tableau pour créer la ligne du temps, et le tour est joué!

Fichier final

Un commentaire sur “Des députés fédéraux
et du web scraping

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *