Fonction du script:
Le script va parcourir chaque
URL donné dans le dossier contenant les URLs, et va en extraire des
données. Les données qui sont
implémentés pour le moment sont :
-Lien vers la page
-Code CURL
-Statut CURL
-Page Aspirée
-Encodage Initial
-DUMP UTF-8
Quelques mots d’explication:
Le Statut CURL est la première
ligne du header HTTP. Quand un client envoie une requête vers le server qui
contient le page web, le client envoie une requête HTTP. Quand le server répond,
il répond avec une réponse HTTP. Cette réponse contient un « header
HTTP », qui contient des informations pour le client, et un « HTTP
body », qui va contenir le HTML du page web, s’il y en a. La première
ligne du header HTTP contient un « code retour ». Ce code donne de
l’information au client sur la page. Voici les explications des codes :
-2xx : OK (La page est retournée avec succès)
-3xx : Moved permanently (la page est déplacée vers un autre URL)
-4xx : Not found (erreur au côté du client)
-5xx : Server error (erreur au
côté du server)
Le code CURL va simplement
extraire ce code donné dans le HTTP header.
L’Encodage du page web est le
format textuel dans lequel la page est montrée. « UTF-8 » est un des
possibilités.
Pour le DUMP UTF-8 on télécharge
la page avec Lynx, on le converti vers l’encodage UTF-8 et on le sauvegarde
dans un fichier txt.
Maintenant, on va analyser le
script en détail.
#!/bin/bash
read DOSSIERURLS;
read fichier_tableau;
echo "Le dossier d'URLS : $DOSSIERURLS " ;
echo "Le fichier contenant le tableau : $fichier_tableau" ;
Le #!/bin/bash signifie
au shell que ce script doit être exécuté avec bash.
Les deux lignes suivantes avec ‘read’ vont lire l’input de l’utilisateur, et
vont sauver cet input dans les variables DOSSIERURLS et fichier_tableau. Les
deux lignes suivantes avec la commande ‘echo’ vont montrer la valeur des
variables dans le shell.
Alternative :
On pourrait aussi directement écrire dans le script le nom du dossier contenant
les URLS, et le nom du fichier dans lequel on écrit le tableau html. Lors que
cette option ne demande pas d’input de l’utilisateur, elle nécessite de changer
le script si on change le nom du dossier, ou du fichier, rendant le script
moins flexible.
Il serait aussi mieux d’ajouter une ligne ‘echo’ avant chaque commande ‘read’,
de cette façon si :
echo ‘’Donnez le nom du dossier contenant les URLS’’
read DOSSIERURLS;
echo ‘’Donnez le nom du fichier dans lequel le tableau html doit être sauvé’’
read fichier_tableau;
# 2. Affichage des tableaux
cpttableau=1;
echo "<html><head></head><body>" > $fichier_tableau ;
Chaque ligne qui commence avec
un # est une ligne avec commentaire
on initialise un variable ‘cpttableau’ sur la valeur 1. Dans la boucle ‘for’
externe, cette variable sera augmentée avec 1 chaque fois que la boucle a
complété une fois.
La troisième ligne va écrire quelques données dans le fichier_tableau.
for fichier in $(ls $DOSSIERURLS);
do # debut du premier for
Cette boucle ‘for’ va
parcourir chaque fichier dans le dossier contenant les URLS (donc, dans le
resultat de $(ls $DOSSIERURLS) ), et donnera cette valeur au variable
‘fichier’.
Dans le script original, la syntaxe du boucle ‘for’ était incorrecte. La
syntaxe correcte est :
for [variable] in [liste] ; do [commande] ; done
# traitement d'un fichier d'URL
compteur=1; #
initialisation d'un compteur pour compter les URLs
echo
"<p align=\"center\"><hr color=\"blue\"
width=\"80%\"/> </p>" >> $fichier_tableau ;
echo "<table
align=\"center\" border=\"1\">" >>
$fichier_tableau ;
echo "<tr><td
colspan=\"8\" align=\"center\">tableau n°
$cpttableau</td></tr>" >> $fichier_tableau ;
echo "<tr><td
align=\"center\"><b>N°</b></td><td
align=\"center\"><b>Lien</b></td><td
align=\"center\"><b>CODE CURL</b><td
align=\"center\"><b>statut CURL</b></td><td
align=\"center\"><b>Page
Aspirée</b></td><td
align=\"center\"><b>Encodage
Initial</b></td><td align=\"center\"><b>DUMP
initial</b></td><td align=\"center\"><b>DUMP
UTF-8</b></td></tr>" >> $fichier_tableau ;
On initialise un deuxième
compteur, qui comptera les URLS dans chaque fichier. Ceci veut dire que, chaque
fois quand la boucle ‘for’ extérieure commence, la valeur de ‘compteur’ est
remise à 1.
Les commandes ‘echo’ qui suivent vont écrire des données pour le tableau html
dans le fichier_tableau.
# traitement de chacun des URLs
for line in $(cat $DOSSIERURLS/$fichier);
#------------------------------------------------
# pour chacune des lignes du fichier d'URL traite (une URL)...
do
On entre le deuxième boucle
for, qui va traiter chaque ligne du $fichier. Chaque ligne contient un URL.
Ici, la syntaxe du boucle ‘for’ était aussi incorrecte dans le script original.
# ==> ASPIRATION DE LA PAGE
echo "TELECHARGEMENT de $line vers ./PAGES-ASPIREES/$cpttableau-$compteur.html"
;
curl $line -o ./PAGES-ASPIREES/"$cpttableau-$compteur".html ;
echo "CODE RETOUR CURL : $?" ;
La commande curl va accéder le
URL et en extraire des données. Dans ce cas-ci, l’option –o [nom du fichier] va
dire à la commande de rédiger l’output vers le fichier spécifié.
Le variable $? est un variable particulier, qui va indiquer si la commande
qu’on vient d’exécuter a été exécuté correctement ou non. Si la valeur
de $? Est égale à 0, alors la commande a été terminé avec succès.
# RECUPERATION DU HEADER HTTP
status1=$(curl -sI $line | head -n 1);
# RECUPATION DU CODE RETOUR HTTP ET DE LA PAGE
status2=$(curl --silent --output
./PAGES-ASPIREES/"$cpttableau-$compteur".html --write-out
"%{http_code}" $line) ;
echo "STATUT CURL : $status2" ;
L’option –s va dire à la
commande de ne pas montrer le progrès, et de supprimer les messages d’erreur.
L’option –I dit à la commande seulement de retourner le header HTTP.
Avec head –n 1, on montre que la première ligne du header. (-n 2 montrerait les
deux premières lignes, etc.). La valeur de cette ligne sera sauvé dans la variable
‘status1’.
Le deuxième curl va rédiger le html du page vers un fichier html, et va
retourner le code http. Celui sera sauvé dans la variable status2.
Alternative :
On peut écrire le deuxième curl en deux fois :
curl --silent --output ./PAGES-ASPIREES/"$cpttableau-$compteur".html
$line
status2=$(echo $status1 | awk ‘{print $2}’)
awk ‘{print $2}’ va
sélectionner le deuxième domaine de status1, ce qui sera le code HTTP.
# ==> DETECTION DE L'ENCODAGE DE LA PAGE en ligne
echo "DETECTION encodage de $line
";
encodage=$(curl -sI $line | egrep -i "charset=" |cut -f2 -d= | tr -d
"\r" | tr
"[:upper:]"
"[:lower:]") ;
echo "ENCODAGE $line : <$encodage>" ;
La partie ‘egrep’ va chercher
pour l’expression "charset=" dans le header HTTP. L’option –i indique
que la capitalisation des lettres n’est pas importante. Même ‘cHaRsEt=’ sera
reconnu par le ‘egrep –i’. Cette commande retourne la ligne entière dans
laquelle l’expression a été trouvée. Après ça, la commande ‘cut’ va couper la
ligne au délimiteur spécifié (dans ce cas : ‘=’), et va sélectionner le
deuxième domaine (-f2). Le bloc suivant, avec la commande ‘tr’ (traduire), va
supprimer le reste de la ligne après l’encodage, et retournera celle-ci en
lettres non-capitalisées.
if [[ $encodage == "utf-8" ]] ;
then
echo "DUMP de $line : via lynx" ;
lynx -dump -nolist -assume_charset=$encodage -display_charset=$encodage
$line> ./DUMP-TEXT/$cpttableau-$compteur.txt ;
echo "ECRITURE RESULTAT dans le tableau" ;
echo "<tr><td
align=\"center\">$compteur</td><td align=\"center\"><a
href=\"$line\">lien n°$compteur</a></td><td
align=\"center\">$status2</td><td
align=\"center\"><small>$status1</small></td><td
align=\"center\"><a
href=\"./PAGES-ASPIREES/$cpttableau-$compteur.html\">P.A n°
$cpttableau-$compteur</a></td><td
align=\"center\">$encodage</td><td
align=\"center\">-</td><td
align=\"center\"><a
href=\"./DUMP-TEXT/$cpttableau-$compteur.txt\">DUMP n°
$cpttableau-$compteur</a></td></tr>" >>
$fichier_tableau ;
‘if’ est une commande qui va
vérifier une déclaration (boolean). Si cette déclaration est juste (true), le
script rentre dans la partie ‘then’. Si cette déclaration est fausse (false),
le script rentre dans la partie ‘else’. Dans ce cas-ci, le script rentre dans
la partie ‘then’ si l’encodage est égale à « utf-8 ». Si l’encodage
est différent, on rentre dans la partie ‘else’.
La commande ‘lynx’ n’est pas
installé par défaut. Pour installer ce programme, j’ai dû tapper : ‘sudo
apt-get install lynx’.
Lynx est un programme qui retourne la page web en format texte. Dans ce cas-ci,
l’encodage est utf-8, donc il n’est pas nécessaire de convertir le résultat. Dans
la ligne suivante, toutes les données seront écrites dans le fichier_tableau.
else
# ... il faut transcoder le contenu de la page en UTF8
lynx -dump -nolist -assume_charset=$encodage -display_charset=$encodage $line |
iconv -f $encodage -t "utf-8" > ./DUMP-TEXT/$cpttableau-$compteur.txt
;
echo "ECRITURE RESULTAT dans le tableau" ;
echo "<tr><td
align=\"center\">$compteur</td><td
align=\"center\"><a href=\"$line\">lien
n°$compteur</a></td><td
align=\"center\">$status2</td><td
align=\"center\"><small>$status1</small></td><td
align=\"center\"><a href=\"./PAGES-ASPIREES/$cpttableau-$compteur.html\">PA
n° $cpttableau-$compteur</a></td><td align=\"center\">$encodage</td><td
align=\"center\"></td><td
align=\"center\"><a
href=\"./DUMP-TEXT/$cpttableau-$compteur.txt\">DUMP n°
$cpttableau-$compteur</a></td></tr>" >>
$fichier_tableau ;
fi ;
Cette partie est presque
identique à la partie ‘then’. La seule différence est qu’on a ajouté la partie
avec ‘iconv’ :
| iconv -f $encodage -t "utf-8"
Cette commande prendra le résultat de la commande lynx, et transformera
celui-ci en encodage utf-8.
‘fi’ signifie la fin du partie ‘if’
# il faut ajouter 1 au compteur de lignes
let "compteur=compteur+1" ; # let "compteur+=1";
done ;
#------------------------------------------------------
echo "</table>" >>
$fichier_tableau ;
let "cpttableau=cpttableau+1";
done ;
echo "</body></html>" >> $fichier_tableau ;
Dans cette dernière partie, on
augmente la valeur des compteurs de 1. On doit bien faire attention, car la
variable ‘compteur’ est augmentée dans la boucle ‘for’ intérieure, lorsque la
variable ‘cpttableau’ est augmentée en dehors de la boucle ‘for’ intérieure. Le
script termine avec les tags de fermeture ‘</body></html>’, que le
script ajoute au fichier_tableau.
Voici le résultat du
script :
Un example d’un des DUMPS de
lynx. Dans ce cas il s’agit de la page www.lesoir.be :
---Wei-Hsuan CHEN.