Description générale du Script

Généralités

Ce script permet de générer un tableau contenant les données importantes de traitement pour les URLs. Ce script prend trois arguments :
-Le fichier d'URL
-Un tableau (que le script génère) qu'il faut nommer et dans lequel le traitement des données sera redirigé
-Une expression régulière permettant de chercher le mot sur lequel nous travaillons (le script sera donc le même pour les différentes langues, sauf si une tokenisation est à faire)



La sortie attendue

La sortie attendue de ce script est donc un tableau comprenant les informations suivantes pour chaque url:

- Un compteur indiquant le numéro de l'URL traitée
- Le code de retour indiquant le statut de la réponse (exemple: réussite, erreurs du serveur, erreurs du client)
- L'URL
- L'encodage de la page (qui devra être UTF-8 pour toutes les URLs)
- Le contenu de la page de l'URL sous le format html (.html)
- Le contenu de la page de l'URL sous le format texte (.txt)
- Le nombre d'occurrences du mot cible dans la page de l'URL
- Le contexte d'apparition, plus précisemment la ligne précédant et suivant le mot cible
- Le concordancier autour du mot cible (jusqu'à 5 mots)



Lancement du script

Pour lancer ce script, il faut se placer à la racine de la page et effectuer la commande suivante dans le terminal: (l'architecture de la page est celle conseillée dans la page d'exercice sur les URLS)
→ bash programmes/base_tableaux_fichier.sh ./URLs/url-Anglais ./tableaux/tableau-Anglais.html "<expression_régulière>" Le dernier élément <expression_régulière> est à remplacer pour chaque fichier d'URL et donc de langue.
Pour l'anglais ce sera: "[S|s]trikes?"
Pour le français ce sera : "[G|g]rèves?"
Pour le vietnamien ce sera à voir sur la page du tableau du script vietnamien.










Script dans son entièreté

#!/usr/bin/env bash

#===============================================================================
# CE BLOC DE COMMENTAIRES.
#===============================================================================


fichier_urls=$1 # le fichier d'URL en entrée
fichier_tableau=$2 # le fichier HTML en sortie

if [[ $# -ne 3 ]]
then
	echo "Ce programme demande exactement trois arguments."
	exit
fi
mot=$3 # expression régulière du mot cible

echo $fichier_urls;
basename=$(basename -s .txt $fichier_urls)

echo "<html><head><link rel="stylesheet" href="style.css"></head><body>" > $fichier_tableau
echo "<h2>Tableau $basename :</h2>" >> $fichier_tableau
echo "<br/>" >> $fichier_tableau
echo "<table>" >> $fichier_tableau
echo "<tr><th>ligne</th><th>code</th><th>URL</th><th>encodage</th><th>dump_html</th><th>dump_text</th><th>occurrences</th>
<th>contextes</th><th>concordances</th></tr>" >> $fichier_tableau

lineno=1;
while read -r URL; do

	#récupération des pages web utilisées en format html
	curl $URL > "./aspirations/$basename-$lineno.html"
	
	echo -e "\tURL : $URL";
	code=$(curl -ILs $URL | grep -e "^HTTP/" | grep -Eo "[0-9]{3}" | tail -n 1)
	charset=$(curl -ILs $URL "./aspirations/$basename-$lineno.html" | grep -Eo "charset=(\w|-)+" | cut -d= -f2 | tail -n 1)

	
	echo -e "\tcode : $code";

	if [[ ! $charset ]]
	then
		echo -e "\tencodage non détecté, on prendra UTF-8 par défaut.";
		charset="UTF-8";
	else
		echo -e "\tencodage : $charset";
	fi

	if [[ $code -eq 200 ]]
	then
		dump=$(lynx -dump -nolist -assume_charset=$charset -display_charset=$charset $URL)
		if [[ $charset -ne "UTF-8" && -n "$dump" ]]
		then
			dump=$(echo $dump | iconv -f $charset -t UTF-8//IGNORE)	
		fi
	else
		echo -e "\tcode différent de 200 utilisation d'un dump vide"
		dump=""
		charset=""
	fi
	
	# Compte des occurrences 
	compte=$(echo $dump | grep -o -i -P "$mot" | wc -l)
	
	echo "$dump" > "./dumps-text/$basename-$lineno.txt"
	
	# construction du contexte 
	echo "$dump" | grep -P -A2 -B2 $mot > "./contextes/$basename-$lineno.txt"
	
	# construction des concordances

 	bash programmes/concordance.sh ./dumps-text/$basename-$lineno.txt $mot > ./concordances/$basename-$lineno.html

	echo "<tr><td>$lineno</td><td>$code</td><td><a href=\"$URL\">$URL</a></td><td>$charset</td><td><a href="../aspirations/$basename-$lineno.html">html</a></td><td>  
	<a href="../dumps-text/$basename-$lineno.txt">text</a></td><td>$compte</td><td>
	<a href="../contextes/$basename-$lineno.txt">contextes</a></td><td>
	<a href="../concordances/$basename-$lineno.html">concordance</a></td></tr>" >> $fichier_tableau
	echo -e "\t--------------------------------"
	lineno=$((lineno+1));
done < $fichier_urls
echo "</table>" >> $fichier_tableau
echo "</body></html>" >> $fichier_tableau 
		    



Description précise du contenuEntrons dans les détails...

Passons maintenant à la description précise du contenu et des commandes du scrpit

		fichier_urls=$1 # le fichier d'URL en entrée
		fichier_tableau=$2 # le fichier HTML en sortie

		if [[ $# -ne 3 ]]
		then
			echo "Ce programme demande exactement trois arguments."
			exit
		fi
		mot=$3 # expression régulière du mot cible
				


Cette partie indique que le script nécessite trois arguments pour fonctionner. Si le nombre d'argument n'est pas respecté alors, le message suivant la commande "echo" sera affiché dans le terminal. Dans le cas où le nombre d'argument est respecté le traitement continue.



		
		echo $fichier_urls;
		basename=$(basename -s .txt $fichier_urls)

		echo "<html><head><link rel="stylesheet" href="style.css"></head><body>" > $fichier_tableau
		echo "<h2>Tableau $basename :</h2>" >> $fichier_tableau
		echo "<br/>" >> $fichier_tableau
		echo "<table>" >> $fichier_tableau
		


La variable "basename" récupère le nom du fichier d'URLs (exemple: url_anglais.txt) et lui enlève son extension text Ce qui suit les commandes "echo" est redirigé vers un fichier dans lequel le tableau sera créé. Pour créer le fichier et rediriger l'information on utilise un chevron simple (utilisé dans le premier echo). Par la suite des chevrons doubles sont utilisés afin d'ajouter du contenu sans rien effacer.

		echo "<tr><th>ligne</th><th>code</th><th>URL</th><th>encodage</th><th>dump_html</th><th>dump_text</th><th>occurrences</th><th>contextes</th>
		<th>concordances</th></tr>" >> $fichier_tableau
				


Ensuite, on crée les colonnes de notre tableau

		lineno=1;
		while read -r URL; do

			#récupération des pages web utilisées en format html
			curl $URL > "./aspirations/$basename-$lineno.html"
				


Un compteur "lineo" est installé et une boucle "while" (tant que) est créée. La boucle continue le traitement des URLs et s'arrête quand il n'y a plus d'URLs à traiter. La commande "curl" ici permet de récuperer les pages web en format html. Ces pages sont redigérées dans le fichier nommé "aspiration" avec le basename ainsi que le numéro de l'URL avec l'extension .html







... Suite description précise du contenu



echo -e "\tURL : $URL";
code=$(curl -ILs $URL | grep -e "^HTTP/" | grep -Eo "[0-9]{3}" | tail -n 1)
charset=$(curl -ILs $URL "./aspirations/$basename-$lineno.html" | grep -Eo "charset=(\w|-)+" | cut -d= -f2 | tail -n 1)
echo -e "\tcode : $code";

	


La variable "code" récupère le code de retour de l'url/page web. À l'aide de la commande -curl et d'une expression régulière le content-type de l'url/page web est récupéré et stocké dans la variable "code". La variable "charset" stocke l'encodage de chaque page. Une fois de plus une expression régulière avec grep sera utilisée. Cet encodage est affiché dans le terminal avec la commande "echo"

Il est possible que rien ne soit mentionné dans content type, on suppose alors que l'encodage est en UTF-8, c'est ce que va faire la boucle "if" si dessous:

if [[ ! $charset ]]
	then
		echo -e "\tencodage non détecté, on prendra UTF-8 par défaut.";
		charset="UTF-8";
	else
		echo -e "\tencodage : $charset";
	fi
	



if [[ $code -eq 200 ]]
	then
		dump=$(lynx -dump -nolist -assume_charset=$charset -display_charset=$charset $URL)
		if [[ $charset -ne "UTF-8" && -n "$dump" ]]
		then
			dump=$(echo $dump | iconv -f $charset -t UTF-8//IGNORE)
		fi
	else
		echo -e "\tcode différent de 200 utilisation d'un dump vide"
		dump=""
		charset=""
	fi
		


Ce morceau de code permet de récupérer le contenu de la page web ayant un content-type de 200 et de le stocker dans une variable nommée dump. Si l'encodage des dumps est différent de l'UTF-8, ils seront convertis en UTF-8. Dans le cas où le content-type est différent de 200 le dump et le charset seront vides.

		
# Compte des occurrences 
compte=$(echo $dump | grep -o -i -P "$mot" | wc -l)
		

Cette partie du programme compte le nombre d'occurrences du troisième argument c'est-à-dire de l'expression régulière du mot cible. Ce nombre d'occurrence est stocké dans la variable compte.

echo "$dump" > "./dumps-text/$basename-$lineno.txt"
	
# construction du contexte 
echo "$dump" | grep -P -A2 -B2 $mot > "./contextes/$basename-$lineno.txt"
		

Un fichier contenant le dumps est crée pour chaque urls et est mis dans le dossier "dumps-text" du git. Un fichier contenant le contexte des dumps, c'est-à-dire les deux lignes avant et après le mot cible, est aussi crée puis redirigé vers le dossier "contextes" du git.


bash programmes/concordance.sh ./dumps-text/$basename-$lineno.txt $mot > ./concordances/$basename-$lineno.html
		

Afin de construire un tableau de concordances, nous faisons appel à un script bash nommé "concordance.sh" (décrit dans l'onglet script/concordances), puis ce tableau de concordancesest redirigé vers le dossier nommé "concordances" du git.

echo "<tr><td>$lineno</td><td>$code</td><td><a href=\"$URL\">$URL</a></td><td>$charset</td><td><a href="../aspirations/$basename-$lineno.html">html</a></td><td>  
	<a href="../dumps-text/$basename-$lineno.txt">text</a></td><td>$compte</td><td>
	<a href="../contextes/$basename-$lineno.txt">contextes</a></td><td>
	<a href="../concordances/$basename-$lineno.html">concordance</a></td></tr>" >> $fichier_tableau
	echo -e "\t--------------------------------"
	lineno=$((lineno+1));
done < $fichier_urls
echo "</table>" >> $fichier_tableau
echo "</body></html>" >> $fichier_tableau
		


Enfin, chaque information est copiée dans une ligne du tableau, puis une fois toutes les urls traitées, les balises fermant le tableau et l'élément html sont copiées mettant fin au tableau et au fichier html.