Formulaire de contact

 

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

  1. COMMENT S'ASSURER QUE LES TRAITEMENTS SE DÉROULENT BIEN ?
  2. COMMENT EXTRAIRE LE TEXTE BRUT DE CHACUNE DES URLS ? (FAUT-IL TRAVAILLER SUR LES PAGES ASPIRÉES OU FAIRE AUTREMENT ?
  3. 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
    EX2 :
    ~/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 commande lynx 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échargements

Q3. 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)
Dans cette séance, nous avons détaillé la première étape.

Solution 1 : tester localement des texts déchargés

Méthode : la commande file -ipermettant 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 -Icar 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] 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.0etc.
    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 sed '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
    seance6_tbl_7cols_beta

  • Fichier html
    seance6_src_html_beta

  • Une des pages déchargées en chinois (colonne 7)
    seance6_txt-dump_cn

  • Une des pages déchargées en français (colonne 7)
    seance6_txt-dump_fr

 

REFERENCES

Total comment

Auteurs

AI_PLURITAL