Barrage par CJ & AB

Réalisation par AB

Le coeur du traitement

Quatre commandes shell essentielles nous permettent de réaliser les traitements de données nécessaires à la construction de notre tableau. Il s'agit de wget, lynx, egrep et sed.
Mais comment fonctionnent-elles?

Wget: le téléchargement de pages web

On utilise cette commande pour télécharger les pages correspondantes à une ou plusieurs URLs et les enregistrer sur la machine locale.

Cette opération pourrait bien sûr se faire sous Windows avec la fonction Enregistrer sous... dans le menu Fichier de notre navigateur préféré. Par contre elle ne pourrait pas être automatisée pour une liste d'URLs. C'est pourquoi, vu le grand nombre de pages à aspirer, on a recours à wget.

Les options de wget en font un outil très puissant.
Par exemple :

D'autres options de base de wget servent à gérer la récursivité du téléchargement :

Notre objectif étant de récupérer uniquement les pages contenant le mot barrage, nous nous limiterons ici à un téléchargement "de surface".

Comme nous travaillons sur des listes d'URLs assez longues, il vaudrait mieux prévoir la durée maximale de téléchargement d'une page, pour éviter qu'un problème de connexion n'empêche la bonne exécution du programme. En effet il existe dans wget une série d'options liées à la durée de téléchargement. Entre autres:

Et pour finir, avec les options --user=nomUtilisateur et --password=motDePasse il nous est possible de télécharger des pages protégées (comme celles du corpus Le Monde, par exemple) en spécifiant le nom d'utilisateur et le mot de passe nécessaires à y accéder.

Syntaxe:

wget -N --user=$user --password=$pass --dns-timeout=60 
--connect-timeout=60 -O ./nomPageAspiree.html url 

Emploi dans le script fait-tableau.sh:

wget -N --dns-timeout=60 --connect-timeout=60 -O ../PAGES-ASPIREES/$fic-$i.html $nom

Pour en savoir plus sur la commande wget cliquer ici.

Lynx: un navigateur web en ligne de commande

A première vue, ce navigateur hypertexte, qui fonctionne uniquement en mode texte et exclut donc l'emploi de la souris, n'apporte rien de plus par rapport à un navigateur classique. L'affichage de la page peut paraître désagréable et la navigation difficile. L'intérêt de lynx se trouve au contraire dans sa capacité à "mettre à plat" la structure d'un site, ce qui permet de manipuler facilement son contenu.

Dans notre cas notamment, nous nous en servirons pour créer une version texte simple de nos pages aspirées, en utilisant l'option -dump suivie d'une rédirection de flot de sortie pointant vers un fichier de texte.

Syntaxe:

lynx -dump ./nomPageAspiree.html > ./nomPageDumpee.txt

Emploi dans le script:

lynx -dump $nom > ../DUMP-TEXT/$fic-$i.txt


Pour en savoir plus sur lynx cliquer ici.

Egrep: le filtrage de texte

Cette commande signifie littéralement: « rechercher globalement (Global) les correspondances avec l'expression régulière (Regular Expression), et imprimer (Print) les lignes dans lesquelles elle correspond ». Elle sert donc à filtrer un texte, c.-à-d. à sélectionner les lignes d’un texte où une chaîne de caractères donnée entre guillemets (dite motif) apparaît.

Nous allons donc exécuter un filtrage sur chaque page dumpée pour en extraire les contextes du mot barrage. Les données sortantes peuvent soit être stockées dans un fichier de texte, soit affectées à une variable qui nous permettra d'afficher le contexte dans une colonne du tableau (voir suite).

Syntaxe:

egrep "motif" ./nomFichier.txt

Emploi dans le script:

egrep -i -A 2 -B 2 "barrage" ./DUMP-TEXT/$i.txt

Options:
-i : indépendamment de la casse
-A n (after) –B n (before): conserve n lignes après et avant la ligne contenant le motif.


Pour en savoir plus sur la commande egrep cliquer ici.

Sed: le remplacement d'expressions régulières

La commande sed avec option -s sert à remplacer une chaîne de caractères donnée (ou plus en géneral une expression régulière) par une autre chaîne de caractères. L'option -g spécifie que le remplacement doit être effectué pour toutes les occurrences de la chaîne.

Syntaxe:

sed 's/chaine1/chaine2/g'

Cette dernière commande n'est pas à priori nécessaire à la création de notre tableau. Nous l'avons quand-même employée deux fois pour améliorer le script.

1) Dans la phase de lecture du répertoire contenant les listes d'URLs, sed nous permet d'éliminer les extensions des fichiers de texte. On obtient de cette façon une liste de mots clés renvoyant aux différents sens du mot barrage. Ces mots serviront à nommer les fichiers des pages aspirées et des pages dumpées correspondantes.

Emploi dans le script:

ls $rep | sed 's/\.txt//g' > ./dir.txt

2) Dans la phase de filtrage on emploie sed pour entourer chaque mot barrage par des balises html de mise en évidence, et aussi pour remplacer chaque fin de ligne par une balise de retour à la ligne, ce qui rend la colonne des contextes bien plus lisible.

Emploi dans le script:

sed 's/[bB][aA][rR][rR][aA][gG][eE]/\\barrage\<\/font\>\<\/strong\>/g'
sed 's/$/\<\br\/\>/g'


Pour en savoir plus sur la commande sed cliquer ici.

La création du tableau html

Le langage html prévoit une série de balises permettant la création des tableaux. Pour que notre programme produise un tableau, il faudra donc qu'il écrive dans un fichier les bonnes balises dans le bon ordre.

L'écriture de texte dans un fichier se réalise avec la commande echo, qui est en fait une simple commande d'affichage.
Si par exemple on écrit en ligne de commande:

echo "bonjour"
On lira à l'écran:
bonjour

Notre but étant d'écrire du texte dans un fichier, nous n'aurons qu'à diriger les données en sortie non pas à l'écran mais vers le fichier en question.
La redirection de flot sortant est réalisée par les symboles > et >> : le premier écrase le contenu éventuel du fichier visé, alors que le second concatène le nouveau texte à l'ancien.
Il faudra donc faire attention à utiliser les bons symboles: > pour la première instruction d'écriture et >> pour les suivantes.

Les premières balises dont nous avons besoin sont:

  • <TABLE></TABLE> pour signaler le début et la fin du tableau, avec option border=1 si l'on souhaite un cadre d'épaisseur 1,
  • <TH></TH> pour donner un titre à une colonne.
Voici la commande qui produit le début du fichier contenant notre tableau html:
echo "<html><head><title>Tableau de liens</title></head><body>
<table border=1>
<th>Liens vers la page WEB</th><th>Pages aspirées</th><th>Pages
dumpées</th><th>Contexte</th>" > ../JOURNAL/tablo-$fic.html;
#code de début de tableau et titre du tableau

Maintenant il faut ajouter des lignes et des colonnes. Le procédé est le suivant: on signale chaque ligne par <TR></TR> et à l'intérieur de celle-ci on écrit chaque cellule avec les balises <TD></TD>. L'attribut width=15% sert à déterminer la largeur de la cellule par rapport à celle du tableau entier.

Le tableau que nous voulons écrire doit contenir une ligne par url, il faut donc utiliser une itération. C'est à dire que pour chaque url prise dans la liste, on écrira une ligne contenant quatre cellules.

Les opérations dont nous avons parlé plus haut doivent aussi être exécutées pour chaque url, elles seront donc incluses dans l'itération, et plus précisement au début de celle-ci. Ensuite on passe à l'écriture de la ligne du tableau.

En résumant on aura :

  • dans la 1ère cellule, un lien renvoyant à l'url elle-même,
  • dans la 2ème, un lien renvoyant au fichier créé par la commande wget,
  • dans la 3ème, un lien renvoyant au fichier créé par la commande lynx -dump
  • dans la 4ème, le texte filtré par egrep et affecté à la varaible $contexte.

Pour créer un lien, on emploie la balise : <a href="nomUrl"></a>.

Voici la commande qui produit une ligne du tableau:

echo "<tr><td width=15%><A href="$nom">page web $i</A></td>
<td width=15%><a href="../PAGES-ASPIREES/$fic-$i.html">page aspirée $i</a></td>
<td width=15%><a href="../DUMP-TEXT/$fic-$i.txt>page dumpée">page dumpée $i</a></td> 
<td width=55%><p>$contexte</p></td></tr>" >> ../JOURNAL/tablo-$fic.html; 

Enfin il ne faudra pas oublier d'écrire le code de fin tableau et de fin de fichier, à l'extérieur de la boucle, biensûr:

echo "</table></body></html>" >> ../JOURNAL/$fic-tablo.html;

Le tableau est maintenant créé.

  • Pour lire le journal de bord d'une débutante qui découvre les tableaux html, cliquer ici.
  • Pour en savoir plus sur les tableaux html cliquer ici.

Automatiser la création des tableaux

Après avoir réalisé le programme de création du tableau, nous nous démandons s'il ne serait pas intéressant d'automatiser cette même tâche afin que tous les tableaux de liens associés aux différents sens du mot barrage soient crées en même temps. L'objectif est que l'utilisateur n'ait qu'à fournir le nom du répertoire et qu'il reçoive en sortie soit plusieurs tableaux, soit une page globale les contenant tous.

Il faudra donc introduire dans le script une nouvelle phase de lecture et transformer l'itération simple en itération double.

Pour la lecture du répertoire on exécute un ls, on élimine les extensions des fichiers (avec sed) et on enregistre les données sortantes dans un fichier de texte (dir.txt).

# crée un fichier txt contenant la liste des
# fichiers-listes d'URLs (noms sans extension)
ls $rep | sed 's/\.txt//g' > ./dir.txt

On a ainsi obtenu une liste de noms de fichiers correspondants aux sens du mot exploré. Par le moyen de cette liste nous pouvons maintenant lire le contenu des fichiers, ainsi que donner des noms "intelligents" aux pages aspirées et aux pages dumpées qui seront créées.

Quant au traitement des données, il sera géré par deux boucles imbriquées. La première se repète pour chaque fichier contenu dans le répertoire...

for fic in `cat ../dir.txt`

...et la deuxième pour chaque url contenue dans chaque fichier :

for nom in `cat $fic.txt`

Dans cette deuxième boucle, on emploie aussi un compteur ($i) pour numéroter les fichiers créés dans les différents répertoires de l'arborescence.

Le même programme réalisé créé à la fois le tableau global et les tableaux séparés. Pour ce faire il faut bien faire attention où l'on place les codes de début et fin tableau : à l'extérieur de toute boucle pour le tableau global, à l'intérieur de la première pour les autres tableaux.

Menu