Bonne nouvelle : les sites inaccessibles (Pourquoi ? cf le blog précédent) se débloquent... enfin, à condition que nous utilisions une VPN...
Récapitulatif de la séance 6 (25/10/2017)
PLAN DU COURS
3 QUESTIONS
- COMMENT S'ASSURER QUE LES TRAITEMENTS SE DÉROULENT BIEN ?
- COMMENT EXTRAIRE LE TEXTE BRUT DE CHACUNE DES URLS ? (FAUT-IL TRAVAILLER SUR LES PAGES ASPIRÉES OU FAIRE AUTREMENT ?
- COMMENT FAIRE EN SORTE QUE LES SORTIES TEXTUELLES PRODUITES SOIENT BIEN ENCODÉES EN UTF-8 ?
N TABLEAUX DE 7 COLONNES
Q1. COMMENT S'ASSURER QUE LES TRAITEMENTS SE DÉROULENT BIEN ?
1.1 L'exécution de commandes se passe bien.
- Rédirection de stdERR vers un fichier log; puis vérifier ce fichier.
Désavantages : lourd, complexe - Code de retour de la dernière commande (ou du dernier pipeline) $?
valeur == 0; => l'exécution se passe bien
valeur != 0; => err
EX1 :
~/Documents/ProjetEncadre20172018/cours/Seance6$ ls | wc -l
4
~/Documents/ProjetEncadre20172018/cours/Seance6$ echo $?
0
~/Documents/ProjetEncadre20172018/cours/Seance6$ on_fabrique_cette_commande p3.html
on_fabrique_cette_commande: command not found
~/Documents/ProjetEncadre20172018/cours/Seance6$ echo $?
127
Désavantages : la bonne exécution des commandes ne veut pas dire que le résultat soit bon
1.2 Le résultat de commandes correspond à l'attente.
En l'occurrence,- il faut vérifier que l'entrée soit en bon état. Précisément, il faut que les URLs soient téléchargeables ;
- il faut s'assurer que les sorties (notamment les textes bruts) soient en utf-8 (à expliquer infra).
Attente : Réponse de requête, ie. code d'état 200 OK
Solution 1 : récupérer l'entête des fichiers d'URLs.
cURL -I (--head)
récupérer uniquement l'entête (ou avec [OPTION] -v, --verbose
, plus ou moins pareille) ;-L
relancer la requête de curl en cas de rédirections.La première ligne de chaque réponse est ce dont nous avons besoin.
EX :
~/Documents/ProjetEncadre20172018/cours/Seance6$ curl -IL http://www.plurital.org
HTTP/1.1 301 Moved Permanently
Server: Varnish
Location: http://www.tal.univ-paris3.fr/plurital/
Content-Type: text/html; charset=utf-8
Cache-Control: max-age=10800
Content-Length: 315
Accept-Ranges: bytes
Date: Sun, 29 Oct 2017 21:02:31 GMT
Via: 1.1 varnish
Age: 27
Connection: keep-alive
HTTP/1.1 200 OK
Date: Sun, 29 Oct 2017 21:02:31 GMT
Server: Apache
Last-Modified: Tue, 12 Sep 2017 15:49:04 GMT
ETag: "6a305-44cb-558fffb905c00"
Accept-Ranges: bytes
Content-Length: 17611
Vary: Accept-Encoding
Content-Type: text/html
Connection: keep-alive
Désavantages : en cas de rédirections, plusieurs réponses
Solution 2 : Récupérer uniquement le code d'état.
Soit extraire à partir du résultat supra,
soit utiliser
[OPTION] -w (--write-out)
pour obtenir le code.EX1 :
~/Documents/ProjetEncadre20172018/cours/Seance6$ curl -sIL http://www.plurital.org| egrep -i 'HTTP\/[0-9]\.[0-9]' | awk '{print $2}'
301
200
Explication :
le motif
'HTTP\/[0-9]\.[0-9]'
correspond aux protocaux HTTP/0.9 HTTP/1.1 HTTP/2.0
etc.awk '{print $2}
imprimer la deuxième "colonne" d'une ligne du type suivant : HTTP/1.1 200 OK
EX2 :
~/Documents/ProjetEncadre20172018/cours/Seance6$ curl -sL --write-out "\n%{http_code}\n" http://www.plurital.org -o t.html
200
Q2. COMMENT EXTRAIRE LE TEXTE BRUT DE CHACUNE DES URLS ? (FAUT-IL TRAVAILLER SUR LES PAGES ASPIRÉES OU FAIRE AUTREMENT ?
Dans cette séance, nous avons utilisé la commandelynx
avec ses options -dump
et -nolist
pour ce faire.lynx
est un navigateur d'informations distribuées à portée générale pour le World Wide Web.[OPTION] -dump
décharger la sortie formatée du fichier par défaut[OPTION] -nolist
désactiver la fonctionnalité de listage des liens dans les déchargementsQ3. COMMENT FAIRE EN SORTE QUE LES SORTIES TEXTUELLES PRODUITES SOIENT BIEN ENCODÉES EN UTF-8 ?
Etapes :- tester l'encodage
- si necessaire, modifier l'encodage (à détailler dans le prochain blog)
Solution 1 : tester localement des texts déchargés
Méthode : la commande
file -i
permettant de connaître le type d’un fichier, y compris son encodage.EX :
~/Documents/ProjetEncadre20172018/PROJET_MOT_SUR_LE_WEB$ for f in `ls ./PAGES-ASPIREES`; do file -i ./PAGES-ASPIREES/$f; done
./PAGES-ASPIREES/1-1.html: text/html; charset=utf-8
./PAGES-ASPIREES/1-2.html: text/html; charset=utf-8
./PAGES-ASPIREES/1-3.html: text/html; charset=utf-8
./PAGES-ASPIREES/1-4.html: text/html; charset=utf-8
./PAGES-ASPIREES/2-1.html: text/html; charset=us-ascii
./PAGES-ASPIREES/2-2.html: text/html; charset=utf-8
./PAGES-ASPIREES/2-3.html: text/html; charset=utf-8
./PAGES-ASPIREES/2-4.html: text/html; charset=us-ascii
./PAGES-ASPIREES/3-1.html: text/html; charset=utf-8
./PAGES-ASPIREES/3-2.html: text/html; charset=utf-8
./PAGES-ASPIREES/3-3.html: text/html; charset=utf-8
./PAGES-ASPIREES/3-4.html: text/html; charset=utf-8
Solution 2 : avant de décharger un fichier, tester l'encodage.
Méthode : toujours
cULR -I
car
l'information sur l'encodage est également intégrée dans l'entête. Nous
pouvons simplement retrouver cette information à l'aide d'une RegExp. (cf exo infra)Désavantages : au cas où l'entête ne retourne aucune information sur l'encodage, il faut fouiller dans l'ensemble d'un fichier html le balise
<meta>
contenant son "charset".
CREATION DE N TABLEAUX DE 7 COLONNES
L'arborescence de notre répertoire de travail :~/Documents/ProjetEncadre20172018/PROJET_MOT_SUR_LE_WEB$ tree -d
.
├── CONTEXTES
├── DUMP-TEXT
├── IMAGES
├── PAGES-ASPIREES
├── PROGRAMMES
├── TABLEAUX
└── URLS
7 directories
Paramètres
~/Documents/ProjetEncadre20172018/PROJET_MOT_SUR_LE_WEB$ cat ./PROGRAMMES/Seance6_parametres
./URLS
./TABLEAUX/Seance6_Tableaux
./PAGES-ASPIREES
./DUMP-TEXT
MISE A JOUR de la version 25/10/2017
i. ajouter la colonne Etat_de_lien (Réponse de requête)
ii. ajouter la colonne Code_retour (le http_code de la Réponse de requête)
iii. ajouter la colonne encodage (pour l'instant, ne récupérer que l'encodage à partir de l'entête à l'aide de curl -I)
iv. ajouter la colonne Dump-text
v. suprimer le table_iterator ; pour remplacer, lire le nom du fichier d'URLs
vi. ajouter une paramètre rep_dump_text pour stocker des texts dump.
3.1 Script
#!bin/bash
#PATH=$PATH:~/home/.../PROJET_MOT_SUR_LE_WEB
#./PROGRAMMES/Seance6-CreationTableau_7cols.sh
#PARAMETRE: ./PROGRAMMES/Seance6_parametres
#EXECUTION
#bash ./PROGRAMMES/Seance6-CreationTableau_7cols.sh < ./PROGRAMMES/Seance6_parametres
#VERSION 20171025
#MISE A JOURS :
# i ajouter la colonne Etat_de_lien (Réponse de requête)
# ii ajouter la colonne Code_retour (le http_code de la Réponse de requête)
# iii ajouter la colonne encodage (pour l'instant, ne récupérer que l'encodage
# à partir de l'entête à l'aide de curl -I)
# iv ajouter la colonne Dump-text
# v suprimer le table_iterator ; pour remplacer, lire le nom du fichier d'URLs
# vi ajouter une paramètre rep_dump_text pour stocker des texts dump
###############################################################################
###############################################################################
###############lire des paramètres dans le fichier Seance6_parametres##########
echo "Création d'une page html contenant trois tableaux ";
read rep;
read table;
read rep_page_aspiree;
read rep_dump_text;
echo "INPUT : nom du répertoire contenant des fichiers d'URLs : $rep";
echo "OUTPUT : nom du fichier html contenant des tableaux : $table";
echo "OUTPUT : nom du répertoire stockant les pages aspirées : $rep_page_aspiree";
echo "OUTPUT : nom du répertoire stockant les texts dump : $rep_dump_text";
echo -e "\n\n\n\n\nVeuillez patienter quelques instants.\n\n\nTravail en mode silence...\n\n\n";
################################################################################
echo -e "<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Tableau URLs</title>\n\t\t<meta charset = 'utf-8'>\n\t</head>\n" > $table;
echo -e "\t<body>\n\t\t<h2 align=\"center\">Tableaux des URLs de teste</h2>" >> $table;
###############################2 iterateurs,1 pour tableau, 1 pour ligne########
#table_iterator=0;
#La première boucle permettant de lire fichier par fichier et de créer n
#tableaux (n = le nombre de fichiers dans le répertoire ./URLS)
for file in `ls $rep`
do
#let "table_iterator = table_iterator++";
echo -e "\t\t<table border = \"1\" bordercolor = \"#47baae\" width = \"80%\" align = \"center\">" >> $table;
echo -e "\t\t\t<tr height = \"30px\" bgcolor = \"#47baae\"><th colspan = \"7\">Tableau-$file</th></tr>" >> $table;
echo -e "\t\t\t<tr>\n\t\t\t<th width = \"5%\" align = \"center\">N°</th>" >> $table;
echo -e "\t\t\t\t<th width = \"20%\" align = \"center\">Etat_de_lien</th>" >> $table;
echo -e "\t\t\t\t<th width = \"15%\" align = \"center\">Code_retour</th>" >> $table;
echo -e "\t\t\t\t<th width = \"15%\" align = \"center\">Encodage</th>" >> $table;
echo -e "\t\t\t\t<th width = \"15%\" align = \"center\">Lien</th>" >> $table;
echo -e "\t\t\t\t<th width = \"15%\" align = \"center\">Page_aspirée</th>" >> $table;
echo -e "\t\t\t\t<th width = \"15%\" align = \"center\">Dump-text</th>\n\t\t\t</tr>" >> $table;
line_iterator=0;
# la seconde boucle permettant de traiter ligne par ligne des urls dans chaque fichier
for line in `cat $rep/$file`
do
let line_iterator++;
#2 variables, 1 pour la page aspirée, 1 pour le text dump
page="$rep_page_aspiree/$file-aspiree-$line_iterator.html";
dump="$rep_dump_text/$file-dump-$line_iterator";
#Demande la réponse de requête, [OPTION]de cURL -s: en mode silence;
#-I:récupérer seulement l'entête info de HTTP; -L: relancer la requête de curl
#en cas de rédirections; le motif 'HTTP\/[0-9]\.[0-9]'correspond aux protocaux
#HTTP/0.9 HTTP/1.1 HTTP/2.0 etc.
#awk '{print $2} imprimer la deuxième "colonne" dans une ligne du type suivant : HTTP/1.1 200 OK, ie. le http_code
# sed 's/\n/\t/g' et 's/\r/\t/g' remplacer des passages à la lignes par une tabulation pour que plusieurs valeurs soient dans la même ligne
lien_statut=`curl -sIL $line|egrep -i 'HTTP\/[0-9]\.[0-9]'| awk '{print $0}' | sed 's/\n/\t/g'|sed 's/\r/\t/g'`;
#Demander le http_code (une autre manière que la RegExp utilisée supra),
#aspirer la page html et la rédiriger avec le nom $page
code_retour=`curl -sL -o $page -w "%{http_code}" $line`;
echo "Etat de lien : $lien_statut"; #test, à enlever après
echo "Code_retour : $code_retour"; #test, à enlever après
echo "################################################################";
#Demander l'encodage
#RegExp: ?<= lookbehind; ?= lookahead
#$0 : l'ensemble de la ligne qui correspond à l'argument grep;
#tolower() transmettre en miniscule
#alternative: démimiter par =
#encodage=`curl -sIL $line |egrep -i "charset"|cut -d"=" -f2`;
encodage=`curl -sIL $line|grep -i -Po '(?<=charset=).+(?=\b)' |awk '{print tolower($0)}'`;
#Récupérer le text, ingnorer des urls dans la page
lynx -dump -nolist $line > $dump;
echo -e "\t\t\t<tr>\n\t\t\t\t<td align = \"center\">$line_iterator</td>" >> $table;
echo -e "\t\t\t\t<td align = \"center\">$lien_statut</td>" >> $table;
echo -e "\t\t\t\t<td align = \"center\">$code_retour</td>" >> $table;
echo -e "\t\t\t\t<td align = \"center\">$encodage</td>" >> $table;
echo -e "\t\t\t\t<td align = \"center\"><a href = '$line'>$file-lien-$line_iterator</a></td>" >> $table;
echo -e "\t\t\t\t<td align = \"center\"><a href = ".$page">$file-aspiree-$line_iterator</a></td>" >> $table;
echo -e "\t\t\t\t<td align = \"center\"><a href = ".$dump">$file-dump-$line_iterator</a></td>\n\t\t\t</tr>" >> $table;
done;
echo -e "\t\t</table>\n" >> $table;
echo -e "\t\t<br/>\n\t\t<hr width = \"80%\" color = \"#47baae\" cb 9 size = \"10\">\n\t\t<br/>" >> $table; #horizontal rule
done;
echo -e "\t</body>\n</html>" >> $table;
echo "Fin de création des tableaux.";
Exécution
~/Documents/ProjetEncadre20172018/PROJET_MOT_SUR_LE_WEB$ bash ./PROGRAMMES/Seance6-CreationTableau_7cols.sh < ./PROGRAMMES/Seance6_pa
rametres
Création d'une page html contenant trois tableaux
INPUT : nom du répertoire contenant des fichiers d'URLs : ./URLS
OUTPUT : nom du fichier html contenant des tableaux : ./TABLEAUX/Seance6_Tableaux
OUTPUT : nom du répertoire stockant les pages aspirées : ./PAGES-ASPIREES
OUTPUT : nom du répertoire stockant les texts dump : ./DUMP-TEXT
Veuillez patienter quelques instants.
Travail en mode silence...
Etat de lien : HTTP/1.1 200 OK
Code_retour : 200
################################################################
Etat de lien : HTTP/1.1 200 OK
Code_retour : 200
################################################################
Etat de lien : HTTP/1.1 200 OK
Code_retour : 200
################################################################
Etat de lien : HTTP/1.1 200 OK
Code_retour : 200
################################################################
Etat de lien : HTTP/1.1 200 OK
Code_retour : 200
################################################################
Etat de lien : HTTP/1.1 200 OK
Code_retour : 200
################################################################
Etat de lien : HTTP/1.1 200 OK
Code_retour : 200
################################################################
Etat de lien : HTTP/1.1 200 OK
Code_retour : 200
################################################################
Etat de lien : HTTP/1.1 301 Moved Permanently
HTTP/1.1 200 OK
Code_retour : 200
################################################################
Fin de création des tableaux.
3.2 Explication
- Créer 2 variables, 1 pour la page aspirée, 1 pour le text déchargé
page="$rep_page_aspiree/$file-aspiree-$line_iterator.html";
dump="$rep_dump_text/$file-dump-$line_iterator";
- Demande la réponse de requête,
[OPTION] decURL -s
: en mode silence;
-I
: récupérer seulement l'entête info de HTTP;
-L
: relancer la requête de curl en cas de rédirections;
le motif'HTTP\/[0-9]\.[0-9]'
correspond aux protocauxHTTP/0.9 HTTP/1.1 HTTP/2.0
etc.
awk '{print $2}
imprimer la deuxième "colonne" dans une ligne du type suivant :HTTP/1.1 200 OK
, ie. le http_code
sed 's/\n/\t/g'
etsed 's/\r/\t/g'
remplacer des passages à la lignes par une tabulation pour que plusieurs valeurs soient dans la même ligne
lien_statut=`curl -sIL $line|egrep -i 'HTTP\/[0-9]\.[0-9]'| awk '{print $0}' | sed 's/\n/\t/g'| sed 's/\r/\t/g'`;
- Demander le http_code (une autre manière que la RegExp utilisée supra), aspirer la page html et la rédiriger avec le nom
$page
code_retour=`curl -sL -o $page -w "%{http_code}" $line`;
- Demander l'encodage
RegExp:?<=
lookbehind;?=
lookahead
$0
: l'ensemble de la ligne qui correspond à l'argument grep;
tolower()
transmettre en miniscule
encodage=`curl -sIL $line|grep -i -Po '(?<=charset=).+(?=\b)'| awk '{print tolower($0)}'`;
Alternative : délimiter par
=
encodage=`curl -sIL $line |egrep -i "charset"|cut -d"=" -f2`;
3.3 RESULTATS
-
Tableaux
-
Fichier html
-
Une des pages déchargées en chinois (colonne 7)
-
Une des pages déchargées en français (colonne 7)