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 :
1234~/Documents/ProjetEncadre20172018/cours/Seance6$ ls | wc -l
4
~/Documents/ProjetEncadre20172018/cours/Seance6$ echo $?
0
1234~/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 :
1234567891011121314151617181920212223~/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 :
123~/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 :
123~/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 :
12345678910111213~/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 :1234567891011~/Documents/ProjetEncadre20172018/PROJET_MOT_SUR_LE_WEB$ tree -d
.
├── CONTEXTES
├── DUMP-TEXT
├── IMAGES
├── PAGES-ASPIREES
├── PROGRAMMES
├── TABLEAUX
└── URLS
7 directories
Paramètres
12345~/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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105#!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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748~/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é
12page="$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
1lien_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
1 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
1encodage=`curl -sIL $line|grep -i -Po '(?<=charset=).+(?=\b)'| awk '{print tolower($0)}'`;
Alternative : délimiter par
=
1encodage=`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)