Une pipe pour télécharger tous les textes adoptés par l’Assemblée nationale

  4 mins read  

Hier, je me suis mis en tête d’essayer d’analyser le contenu de tous les textes adoptés par l’Assemblée nationale sous la législature actuelle (la quatorzième de la Vème République) pour voir comment les questions relatives au numérique y sont traitées. C’est un vaste sujet et si cette analyse se révèle fructueuse, je ne manquerai pas d’écrire un petit billet à ce sujet.

Là n’est pas mon propos aujourd’hui. Pour me livrer à cet exercice, il m’a fallu télécharger tous les textes adoptés. J’ai utilisé pour cela une astuce que j’utilise tous les jours et même plusieurs fois par jour : générer des commandes shell avec un script quelconque puis les faire exécuter en utilisant le pipe (|).

Télécharger les textes adoptés

Les textes adoptés sont tous listés sur une page dédiée du site de l’Assemblée nationale, dans l’ordre antéchronologique, 150 par page. Je suis naturellement trop paresseux pour tous les télécharger un par un. J’ai voulu faire un script.

Pour commencer, je voulais récupérer chacun de ces textes sous la forme d’un fichier texte. Un outil bien adapté pour ce travail est le navigateur web en mode texte lynx, dans les Linux modernes, il est remplacé par une version plus récente appelée links (voir links2). Ce navigateur permet de surfer sur le web en mode texte, ce qui peut être utile dans certains cas ; surtout, il propose une option -dump qui envoie le contenu de la page sur la sortie standard, c’est-à-dire généralement l’écran.

Ainsi, si vous tapez dans un terminal :

$ links2 http://liltools.lacherez.info

vous verrez ce blog dans une version texte. Pour naviguer, sachez que <flèche vers le bas> vous permet de passer de lien en lien, <flèche vers la droite> de suivre un lien et q de sortir.

Mes petits outils dans links2

Si, en revanche vous saisissez :

$ links2 -dump http://liltools.lacherez.info

tout le contenu de la page s’affichera sous forme de texte (j’insiste sur ce point : c’est du texte que vous voyez et non du HTML).

Il suffit alors de rediriger la sortie standard vers un fichier pour que le contenu de la page soit stocké dans ce fichier sous forme de texte :

links2 -dump http://liltools.lacherez.info > liltools.txt

Pour en revenir à l’Assemblée nationale, la commande

$ links2 -dump http://www2.assemblee-nationale.fr/documents/notice/14/ta/ta0811/(index)/ta > 0811.txt

écrira le texte adopté numéro 811 dans un fichier 0811.txt.

Tout cela est bel et bon, mais, me direz-vous, je n’ai aucune envie de répéter cette opération plus de 800 fois… C’est précisément pour cette raison que vous êtes sur ce blog :) .

Je vais donc écrire un minuscule morceau de python pour écrire ces 800 et quelques commandes :

for a in range(1,829):
    numero = "{:0>4}".format(a)
    url = "http://www2.assemblee-nationale.fr/documents/notice/14/ta/ta%s/(index)/ta" % numero
    print("links2 -dump '%s' > %s.txt\necho %s" % (url, numero, numero))
    
recupere.py

Il y a 828 textes au moment où je fais cette opération. Ils sont numérotés de 1 à 828 et dans l’adresse leur numéro est noté sur quatre chiffres.

Je fais donc une boucle de 828 itérations (en python range(1, 829) renvoie une liste des nombres de 1 à 828, c’est un peu étrange, mais il suffit de le savoir).

Je formate chaque nombre de façon à avoir une chaîne de 4 caractères, en complétant avec des 0 le cas échéant :

numero = "{:0>4}".format(a)

Je place ce numero au bon endroit de l’adresse (identifié par %s) :

url = "http://www2.assemblee-nationale.fr/documents/notice/14/ta/ta%s/(index)/ta" % numero

Il ne me reste plus qu’à écrire ma commande avec links2 :

print("links2 -dump '%s' > %s.txt\necho %s" % (url, numero, numero))

Naturellement, je redirige la sortie de la commande vers un fichier portant le même numéro et une extension .txt et pour ne pas m’impatienter, j’ajoute echo et le numéro, de façon à toujours savoir où j’en suis de mon téléchargement.

Quand je lance mon script, (python3 recupere.py) j’obtiens donc, pour chaque numéro, deux lignes de la forme :

links2 -dump 'http://www2.assemblee-nationale.fr/documents/notice/14/ta/ta0820/(index)/ta' > 0820.txt
echo 0820


Les 828 commandes générées

C’est là qu’arrive le pipe : je passe ces lignes à un shell :

python3 recupere.py | sh

Et là, devant vos yeux ébahis, tous les fichiers se téléchargent automatiquement !

Quel est l’intérêt du pipe ?

Evidemment, j’aurais pu utiliser d’autres fonctions en python pour télécharger les fichiers, sans passer par le shell.

L’avantage de ce système est que d’abord, il est facile à déboguer : je commence par afficher toutes mes commandes avant de les exécuter, il est facile de bien vérifier qu’elles correspondent bien à ce que j’attends.

La logique est très simple à suivre (j’ai toutes les commandes les unes après les autres) et je peux facilement reprendre n’importe où si la démarche a été arrêtée en cours pour une raison quelconque.

En outre, je peux utiliser simplement des outils unix classiques, sans être obligé de les récrire à partir de rien (je n’ai pas envie de recréer grep ou links, puisqu’ils existent déjà et qu’ils sont bien meilleurs que ce que je ferai jamais).

Voir le script sur Github