#!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 "Tableau
" > $tableau; # On crée les répertoires qui contiendront les sous-répertoires des fichiers dumpés avec leur codage initial puis en utf8 dossierDump1=`mkdir ../DUMP-TEXT/dump`; dossierDumputf8=`mkdir ../DUMP-TEXT/dumputf8`; dossierContexteUTF8=`mkdir ../CONTEXTES/CONTEXTE_UTF8`; dossierContexteHMTL=`mkdir ../CONTEXTES/CONTEXTE_HTML`; # La boucle 'while' lira (s'exécutera) chaque ligne du fichier liste d'urls autant de fois qu'il y a de fichiers d'urls et stockera le contenu de la ligne dans la variable -$nomUrl- while read nomUrl do # la variable -$langue- contiendra le contenu de la première ligne du fichier $nomUrl (fichier d'url) courant servant à nommer chaque tableau langue=`head -1 $nomUrl`; # On crée les répertoires qui contiendront les pages aspirées, les pages dumpées (version charset initial si différent d'utf8 puis en utf8) et les contextes repertoireLangue=`mkdir ../PAGES-ASPIREES/$langue`; repertoireDump=`mkdir ../DUMP-TEXT/dump/$langue`; repertoireDumputf8=`mkdir ../DUMP-TEXT/dumputf8/$langue`; repertoireContexteUTF8=`mkdir ../CONTEXTES/CONTEXTE_UTF8/$langue`; repertoireContexteHMTL=`mkdir ../CONTEXTES/CONTEXTE_HTML/$langue`; # Insertion du contenu de $langue dans un ficheir pour le traiter ultérieurement echo "$langue" > titreTableau.txt; # La commande SED permet de remplacer un motif recherché dan un fichier titreTableauSansUnderscore=$(sed "s/_/ /g" titreTableau.txt); # On récupère le motif recherché pour chaque tableau cut -d= -f2 ../CONTEXTES/motif_URLs_$langue.txt > motifUTF8.txt; motifUTF8=`cat motifUTF8.txt`; # Par la variable -$langue- dans le titre du tableau, on connaîtra la langue des urls ainsi que la période (avant ou après Fukushima) et on enverra le début du code html dans la variable -$tableau- echo "" >> $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 ""); ############################################################################# # 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 ""`; 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 ""`; 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 ""); # Même chose ^^ dumpInitial=$(echo ""); 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 ""`; problemePage=$(echo "rien"); else # Affiche le lien vers la page dumpée en utf8 dumpUTF8=`echo ""`; fi # Affiche le lien vers la page contextualisée via le script Perl contexteHTML=`echo ""`; # Affiche le lien vers la page contextualisée via la commande 'egrep' contexteUTF8=`echo ""`; # Affiche le nombre d'occurrences du motif recherché dans la page contextualisée par la commande 'egrep' occurrenceMotif=`echo ""`; fi else # Variable contenant les codes erreur lors de l'aspiration pour toutes les pages pageTraitement=$(echo ""); # 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 ""`; else dumpInitial=`echo ""`; fi dumpUTF8=""; contexteHTML=""; contexteUTF8=""; occurrenceMotif=""; fi # On affiche chaque ligne du traitement qui sera ajoutée dans le tableau Html echo "$pageTraitement$dumpInitial$dumpUTF8$contexteUTF8$contexteHTML$occurrenceMotif" >> $tableau; fi # On incrémente de 1 la variable ligne en fin de boucle. Ainsi, à la prochaine exécution de la boucle, cette variable sera "augmentée" de 1 let 'ligne+=1'; let 'totalVar+=var'; # On envoie les fichiers d'url à la boucle 'while' pour qu'il puisse lire les lignes définissant les urls par langue et par période done < $nomUrl; let 'ligne=0'; # Affichage des cellules du tableau contenant le nombre de pages traitées mises dans les fichiers dump global et contexte global et le nombre d'occurrences totales, par langue et par période echo "
Tableau de liens des URLS $titreTableauSansUnderscore
N° URLsLIENs URLsASPIRATIONREPONSES DU RETOUR
CURL
DUMPING
INITIAL
DUMPING
UTF-8
CONTEXTES UTF-8CONTEXTES HTMLOCCURRENCES DU
MOTIF :
# $motifUTF8 #
Code retour de la page HTML : $coderetour
Code erreur : $retourCurl
[Traitement possible]
-DUMP
[Encodage : $encodage]
DUMP
[Encodage : $encodage]
Code retour de la page HTML : $coderetour
Code erreur : $retourCurl
Encodage non reconnu :
Traitement impossible ...
DUMP UTF8
Dumping possible mais inutilisable pour le traitement dans le fichier global pour les nuages le trameur
DUMP UTF8CONTEXTE $ligneCONTEXTE $ligneNombre d'occurrences:
$var
Code retour de la page HTML :$coderetour
Code erreur : $retourCurl
Problème lors de l'aspiration. Dumping possible mais inutile pour le traitement dans le fichier global pour les nuages et le trameurPage HTML non aspirable,
Dumping et Extraction
de contexte impossible
$ligneURL $lignePage aspirée $ligne
Dump global :
$nbreD fichiers
Contexte global :
$nbreC fichiers
Occurrences totales :
$totalVar

" >> $tableau; let 'nbreC=0'; let 'nbreD=0'; let 'totalVar=0'; let 'var=0'; # On envoie le fichier de la liste d'url à la boucle 'while' pour qu'il puisse lire les lignes du fichier définissant une langue et une période done < $url; # On termine (ferme) le fichier html (contenu dans la variable $tableau) en y concaténant les balises de fermeture d'un fichier html echo "
" >> $tableau;