#!bin/bash # On va lire la première ligne du fichier, à savoir le fichier contenant les urls tableau_url_input.txt via l'opérateur de transfert de flux "<" vers ce script lors de son exécution : bash nom_du_script.sh < tableau_url_input.txt read url; # De la même façon que précédemment, on lira ici la deuxième ligne du fichier tableau_url_input.txt, à savoir le fichier html (stocké dans la variable tableau) où apparaîtra le tableau de liens read tableau; # On initialise une variable que l'on incrémentera à chaque exécution des instructions de la boucle pour chaque url ligne=0; # On initialise une vriable qui va compter les pages d'url dumpées contenu dans le fichier dump global nbreD=0; # On initialise une vriable qui va compter les pages d'url contextualisées via la commande "egrep" contenu dans le fichier contexte global nbreC=0; # On initialise une vriable qui va compter les occurrences totales du motif recherché selon la langue et la période totalVar=0; # On initialise une vriable qui va compter les occurrences pour chaque page d'url var=0; # On crée le début du fichier html dans lequel notre tabeau de liens apparaîtra echo "
N° URLs | LIENs URLs | ASPIRATION | REPONSES DU RETOURCURL | DUMPINGINITIAL | DUMPINGUTF-8 | CONTEXTES UTF-8 | CONTEXTES HTML | OCCURRENCES DU MOTIF : # $motifUTF8 # | " >> $tableau;
# Cette seconde boucle permet de lire le contenu des différents fichiers d'urls ligne par ligne qui seront stockées dans la variable -$urllangue-
# Ces deux boucles permettent de lire autant de fichiers d'urls contenus dans un fichier liste d'urls par exemple et évite ainsi de réécrire le même code source pour chaque fichier d'urls
while read urllangue
# Pour chaque url, on ajoutera une ligne au tableau de liens avec une colonne indiquant le numéro des urls, une autre avec les liens actifs de chaque url
do
#############################################################################
# DEBUT de l'aspiration des pages urls #
#############################################################################
# Si -$ligne- vaut zéro alors on récupère le titre du tableau (défini par le contenu de la première ligne du fichier des URLs à traiter) sinon on commence le traitement de chaque URL
if (($ligne!=0))
then
# L'option "L" permet de suivre les liens liés à la page
# L'option "E" permet de mettre le fichier aspiré au format html en rajoutant .html à la fin du lien
# L'option "o" permet de spécifier le fichier dans lequel sera enregistré le résultat retourné par la commande CURL
# L'option "w" permet de retourner le code HTTP de la page HTML précisant ainsi si l'opération s'est déroulée correctement(si 200 alors ok). On envoie alors le résultat du code retour dans un fichier texte pour pouvoir le réutiliser par la suite
# La commande CURL permet d'aspirer le contenu textuel de la page URL
pa=`curl -e -L -o ../PAGES-ASPIREES/$langue/pa$ligne.html $urllangue -w "\nstatus:%{http_code}\n" > ../PAGES-ASPIREES/$langue/crpa$ligne.txt`;
#############################################################################
# FIN de l'aspiration des pages urls #
#############################################################################
# On peut également enregistrer la réponse de CURL directement via la variable -$?- qui contient le résultat de la dernière commande appelée (ici, la commande CURL; si -$?- vaut 200 alors ok)
retourCurl=$?;
# On récupère la valeur de la réponse de la commande CURL grâce au fichier texte utiliser dans la commande CURL précédemment
coderetour=$(tail -1 ../PAGES-ASPIREES/$langue/crpa$ligne.txt | cut -d: -f2);
# Via l'option "l" de la commande ICONV, on demande la liste des encodages connus par UNIX et on l'enregistre dans un fichier texte pour une réutilisation ultérieure
iconv -l > listeencodage.txt;
# Si la réponse de la commande CURL n'aboutit pas alors le traitement de la page html n'est pas possible sauf le retour html vaut 301 (redirection)
if (($retourCurl==0 && ($coderetour==200 || $coderetour==301)))
then
# On crée une colonne avec la réponse de la commande CURL et le code retour de la pge HTML (200 si ok)
pageTraitement=$(echo "Code retour de la page HTML : $coderetourCode erreur : $retourCurl[Traitement possible] | "); ############################################################################# # DEBUT de la récupération du charset # ############################################################################# # On commence par récupérer la balise META contenant le charset de la page HTML pour connaître l'encodage utilisé pour afficher les caractères de ladite page egrep -i -m 1 -o "]*charset[ \"']*=[ \"']*[^<>\"']+[ \"'/]*[^<>]*>" ../PAGES-ASPIREES/$langue/pa$ligne.html > ../DUMP-TEXT/charsethtml.txt; # Ensuite on récupère le segement de la balise META contenant le charset avec d'éventuels signes de ponctuation comme les double quotes egrep -i -o -m 1 "charset[ \"']*=[ \"']*[^<>\"']+" ../DUMP-TEXT/charsethtml.txt > ../DUMP-TEXT/charsethtmlCharset.txt; # On récupère le charset avec les double quotes dans une variable encodageNonConforme=`cat ../DUMP-TEXT/charsethtmlCharset.txt`; # On vérifie si le charset contient des double quotes nbrOccquote=$(egrep -o -m 1 -c "\"" ../DUMP-TEXT/charsethtmlCharset.txt); # On vérifie la présence de double quotes éventuelles if (($nbrOccquote!=0)) then # s'il y en a, on récupère le charset sans double quotes encodage=$(cut -d\" -f2 ../DUMP-TEXT/charsethtmlCharset.txt); else # Sinon on récupère simplement le charset encodage=$(cut -d= -f2 ../DUMP-TEXT/charsethtmlCharset.txt); fi # On compte les occurrences du charset extrait s'il est reconnu par la liste de charsets donnée par la commande ICONV -l vue précédemment occurrence=$(egrep -c -i -o "$encodage" listeencodage.txt); # Si le charset est reconnu (!=0) et s'il n'est pas vide(<1000). Cad si la balise META contenant le charset n'a pas été trouvée if (($occurrence!=0 && $occurrence<1000)) then #if (($occurrence>1000)) #then # encodage="utf-8"; #else encodage=$encodage; #fi # Si le charset n'est pas reconnu (absence de la balise META donc équivalent à 'vide' (occurrences du 'vide' reconnues plus de 1000 fois dans la commande ICONV -l) else # On tente de récupérer le charset via la commande FILE grâce à l'option -i file -i ../PAGES-ASPIREES/$langue/pa$ligne.html > ../DUMP-TEXT/encodagefichier.txt; # On récupère alors le charset ainsi défini valeurCodage=$(cut -d= -f2 ../DUMP-TEXT/encodagefichier.txt); # On vérifie si le charset existe (cf. ICONV -l) occurrence=$(egrep -c -i -o "$valeurCodage" listeencodage.txt); # Si c'est le cas if (($occurrence!=0)) then # Le charset est reconnu encodage=$valeurCodage; # Sinon, impossible de traiter la page else # On donne une valeur arbitraire à la variable $encodage pour reconnaître le problème rencontré et le traiter en conséquence encodage=$(echo "null"); fi fi ############################################################################# # FIN de la récupération du charset # ############################################################################# ############################################################################# # DEBUT de la récupération du texte brut : dumping # ############################################################################# # On vérifie si le charset existe bien, auquel cas on pourra poursuivre le traitement if test $encodage != "null" then # On teste l'encodage : si déjà en UTF8 if test $encodage = "utf-8" || test $encodage = "UTF-8" then # Initialisation de la case correspondant au dump initial selon si la page est déjà ou non en utf8 dumpInitial=$(echo "- | "); # on effectue un dump. Cad qu'on récupère le contenu de la page HTML en contenu te xtuel brut (alors encodé en UTF8) lynx -nolist -display_charset=$encodage -dump ../PAGES-ASPIREES/$langue/pa$ligne.html > ../DUMP-TEXT/dumputf8/$langue/dump$ligne.txt; # Après avoir repéré le fichier contenant une erreur d'encodage lors de la création du fichier, on l'isole car impossible à traiter dans le trameur if test $langue = "françaises_après_Fukushima" && test $ligne = 2 then # On initialise une variable qui nous permettra de reconnaître ledit fichier corrompu problemePage=$(echo "pap"); else # Si le fichier n'est pas corrompu, on le met dans le fichier dump global cat ../DUMP-TEXT/dumputf8/$langue/dump$ligne.txt >> ../DUMP-TEXT/dumpGlobalUTF8_$langue.txt; # On réinitialise la variable pour recommencer le test pour la prochaine page problemePage=$(echo "rien"); let 'nbreD+=1'; fi else # On enregistre le charset dans un fichier pour l'utilser avec la commande 'CUT' echo $encodage > encodage.txt; if test $encodage = "utf-16le" || test $encodage = "UTF-16LE" then #echo "je suis UTF16"; lynx -nolist -assume_charset=$encodage -dump ../PAGES-ASPIREES/$langue/pa$ligne.html > ../DUMP-TEXT/dump/$langue/dump$ligne.txt; dumpInitial=`echo "DUMP [Encodage : $encodage] | "`; encodage="utf-8"; echo $encodage; else # On effectue à nouveau un dump pour les pages avec un encodage initial différent de UTF8 lynx -nolist -display_charset=$encodage -dump ../PAGES-ASPIREES/$langue/pa$ligne.html > ../DUMP-TEXT/dump/$langue/dump$ligne.txt; dumpInitial=`echo "DUMP [Encodage : $encodage] | "`; fi # Grâce à la commande ICONV et ses options -f et -t, on convertit le fichier initial encodé autre que UTF8 en UTF8 et l'option -c permet de forcer la conversion même lorsque certains caractères posent problème iconv -c -f $encodage -t utf8 ../DUMP-TEXT/dump/$langue/dump$ligne.txt > ../DUMP-TEXT/dumputf8/$langue/dump$ligne.txt; # On ajoute la page dumpée en utf8 au fichier dump global cat ../DUMP-TEXT/dumputf8/$langue/dump$ligne.txt >> ../DUMP-TEXT/dumpGlobalUTF8_$langue.txt; let 'nbreD+=1'; fi else # On affiche dans le tableau final le résultat du traitement de la page HTML problématique pageTraitement=$(echo "Code retour de la page HTML : $coderetourCode erreur : $retourCurl | "); # Même chose ^^ dumpInitial=$(echo "Encodage non reconnu : Traitement impossible ... | "); fi ############################################################################# # FIN de la récupération du texte brut : dumping # ############################################################################# if test $encodage = "null" then # Chacune des variables seront nulles car la la page ne peut être traitée (problème encodage, problème lors de l'apiration, ...) dumpUTF8=""; contexteUTF8=""; contexteHTML=""; occurrenceMotif=""; else ############################################################################# # DEBUT de la récupération du contexte : comande 'egrep' # ############################################################################# egrep -w -i "$motifUTF8" ../DUMP-TEXT/dumputf8/$langue/dump$ligne.txt > ../CONTEXTES/CONTEXTE_UTF8/$langue/contexte$ligne.txt; if test $langue = "françaises_après_Fukushima" && test $ligne = 2 then # Isolation de la page mal encodée problemePage=$(echo "pap"); else # Ajout des contextes de la page traitée dans le fichier contexte global cat ../CONTEXTES/CONTEXTE_UTF8/$langue/contexte$ligne.txt >> ../CONTEXTES/contexteGlobalUTF8_$langue.txt; problemePage=$(echo "rien"); let 'nbreC+=1'; fi ############################################################################# # FIN de la récupération du contexte : comande 'egrep' # ############################################################################# ############################################################################# # DEBUT de la récupération du contexte : script Perl 'minigrep' # ############################################################################# # On crée le fichier contenant le contexte de la page lié au motif recherché repContextes="../CONTEXTES/CONTEXTE_HTML/$langue/contexte$ligne"; # On indique le fichier contenant le motif recherché fichiersMotif="../CONTEXTES/motif_URLs_$langue.txt"; # Grâce à un petit script écrit en PERL, on peut extraire un contexte (page dump en UTF8)à partir d'un motif (le mot recherché contenu dans un fichier)qui seront passés en argument. Le nouveau fichier contenant les contextes sera enregistré dans le répertoire CONTEXTE via ce script perl minigrep/minigrepmultilingue.pl "utf8" "../DUMP-TEXT/dumputf8/$langue/dump$ligne.txt" "$fichiersMotif" "$repContextes" | tail -2 > test.txt; # On récupère la première ligne du fichier test.txt qui contient les deux dernières lignes affichées à l'écran aprèsl'exécution du script PERL : le motif et le nombre d'occurrences motif=$(head -1 test.txt); # Pareil mais avec la dernière ligne var=$(tail -1 test.txt); ############################################################################# # Fin de la récupération du contexte : script Perl 'minigrep' # ############################################################################# # Page non utilisable pour le trameur if test $problemePage = "pap" then dumpUTF8=`echo "DUMP UTF8 Dumping possible mais inutilisable pour le traitement dans le fichier global pour les nuages le trameur | "`;
problemePage=$(echo "rien");
else
# Affiche le lien vers la page dumpée en utf8
dumpUTF8=`echo "DUMP UTF8 | "`; fi # Affiche le lien vers la page contextualisée via le script Perl contexteHTML=`echo "CONTEXTE $ligne | "`; # Affiche le lien vers la page contextualisée via la commande 'egrep' contexteUTF8=`echo "CONTEXTE $ligne | "`; # Affiche le nombre d'occurrences du motif recherché dans la page contextualisée par la commande 'egrep' occurrenceMotif=`echo "Nombre d'occurrences:$var | "`; fi else # Variable contenant les codes erreur lors de l'aspiration pour toutes les pages pageTraitement=$(echo "Code retour de la page HTML :$coderetourCode erreur : $retourCurl | "); # S'il y a eu un problème lors de l'aspiration, page inutile à traiter (contenu "vide") if (($coderetour==302 || $coderetour==403 || $coderetour==404)) then dumpInitial=`echo "Problème lors de l'aspiration. Dumping possible mais inutile pour le traitement dans le fichier global pour les nuages et le trameur | "`; else dumpInitial=`echo "Page HTML non aspirable,Dumping et Extraction de contexte impossible | "`; fi dumpUTF8=""; contexteHTML=""; contexteUTF8=""; occurrenceMotif=""; fi # On affiche chaque ligne du traitement qui sera ajoutée dans le tableau Html echo "
---|---|---|---|---|---|---|---|---|
$ligne | URL $ligne | Page aspirée $ligne | $pageTraitement$dumpInitial$dumpUTF8$contexteUTF8$contexteHTML$occurrenceMotif||||||
Dump global :$nbreD fichiers | Contexte global :$nbreC fichiers | Occurrences totales : $totalVar |