Contrôlez votre site avec un script Bash

Il y a quelques jours, je vous expliquais comment utiliser un terminal Linux pour optimiser son site. Voici un exemple concret de ce qu’il est possible de faire grâce à un script Bash. Ce dernier va générer un fichier contenant l’URL, le contenu de l’élément title, le contenu de la meta description, le contenu de la meta robots et le nombre d’URL total et externes.

Présentation du script

Si vous ne l’avez pas lu, et pour mieux comprendre les commandes utilisées dans ce script, je vous invite à lire « Optimiser son site avec le terminal Linux ». J’y détaille la plupart des options utilisées dans ce script. Si vous débutez avec Bash, c’est l’occasion de comprendre plus en détail ce que le script fait.

Le script va récolter diverses informations sur le site indiqué. Actuellement, vous obtiendrez :

  • le Header Status (202, 301, 404…)
  • le contenu des éléments title, <meta name="description" ... />, <meta name="robots" ... />
  • le nombre d’URL total
  • le nombre d’URL externes

Pour personnaliser le script :

  • Vous pouvez changer le séparateur dans le script. Ici, j’utilise le point-virgule.
  • J’ai exclu un certain nombre d’URL dans le script (images, css, pdf…) mais ce ne sera peut-être pas suffisant pour votre site. Si vous savez ce que vous faîtes, vous pouvez en ajouter.
  • Vous pouvez ajouter d’autres informations si vous vous y connaissez en script Bash.

Utilisation du script

Pour utiliser le script, il suffit de copier le code et de l’enregistrer dans un fichier .sh. Pour l’exécuter, ouvrez un terminal puis :

sh nom-du-fichier.sh

Le script a besoin de Lynx. Si vous ne l’avez pas, installez-le.

// Sur Manjaro
sudo pacman -S lynx

Le script va vous demander de renseigner une URL. L’URL doit comporter le sous-domaine (exemple : « www ») ou commencer par « http(s) » ; vous ne pouvez pas saisir uniquement le nom de domaine.

Ensuite, vous n’aurez plus rien à faire, à part attendre que le script est fini son travail. Le temps d’attente peut-être long suivant le nombre d’URL présents sur votre site ; soyez patients. Pour montrer que la tâche est toujours en cours d’exécution, j’ai intégré un « spinner » grâce à Louis Marascio.

Les différentes étapes :

  • le script récupère l’ensemble des URLs de votre site et les enregistre dans un fichier texte
  • il va ensuite récupérer les données et les stocker dans des variables
  • ces variables sont utilisées pour créer différentes colonnes dans un fichier CSV
  • une fois la liste des URLs parcourue, le script supprime le fichier texte

Récupérer le script

#! /bin/bash
# extract-website-info.sh
# Script to extract some data for all website pages: header status, title, meta description, meta robots, links number and external links number.
# Originally written by Armand Philippot <contact@armandphilippot.com>.

echo -e "Ce script permet d'extraire le contenu des éléments title et meta description sur toutes les pages d'un site.\n"

# We are testing whether Lynx is installed. If it is not, we stop the script.
if command -v lynx &>/dev/null
then
    echo -e "Lynx est bien installé, poursuivons.\n"
else
    echo -e "Lynx n'est pas installé. Veuillez l'installer pour utiliser ce script.\n"
    exit 2
fi

# We ask for the website to crawl
read -p "Saisir l'URL du site: " _site_url

# We create a spinner
# Thanks to Louis Marascio - http://fitnr.com/showing-a-bash-spinner.html
spinner()
{
    local pid=$!
    local delay=0.75
    local spinstr="-\|/"
    while [ "$(ps a | awk '{print $1}' | grep $pid)" ]; do
        local temp=${spinstr#?}
        printf " [%c]  " "$spinstr"
        local spinstr=$temp${spinstr%"$temp"}
        sleep $delay
        printf "\b\b\b\b\b\b"
    done
    printf "    \b\b\b\b"
}

# We display a warning message.
echo -e "Nous parcourons le site pour récupérer la liste d'URL. Cela peut prendre du temps, d'autant plus si votre site en comporte beaucoup.\n"
echo -e "Veuillez patienter.\n"

# We store the output of wget (urls list) in a temporary text file.
wget --spider --no-check-certificate --force-html -nd --delete-after -r -l 0 $_site_url 2>&1 | grep '^--' | awk '{ print $3 }' | grep -v '\.\(css\|js\|png\|gif\|jpg\|ico\|webmanifest\|svg\|pdf\|txt\)$' | grep -v '\/feed\/\|selectpod\.php\|xmlrpc\.php\|matomo-proxy\.php' | sort | uniq > extract-website-info.txt & spinner

# We define a separator for our CSV file.
_sep=";"

# We create our CSV file and write headers.
echo "URL${_sep}Header Status${_sep}Title${_sep}Meta description${_sep}Meta robots${_sep}Nombre de liens${_sep}Nombre de liens externes" > extract-website-info.csv

# We display a warning message.
echo -e "Nous traitons les URLs. Cela peut prendre du temps.\n"
echo -e "Veuillez patienter."

# We read each entry, we extract title and meta description and we write values in CSV file.
while read _url
do
    _header="`curl -s -o /dev/null -w '%{http_code}' -I $_url`"
    _curl_output="`curl -s $_url`"
    _title="`echo $_curl_output | awk 'BEGIN{IGNORECASE=1;FS="<title>|</title>";RS=EOF} {print $2}'`"
    _description="`echo $_curl_output | sed -n 's/.*<meta name="description" content="\([^"]*\)".*/\1/p'`"
    _robots="`echo $_curl_output | sed -n 's/.*<meta name="robots" content="\([^"]*\)".*/\1/p'`"
    _lynx_output="`lynx -dump -listonly -nonumbers $_url`"
    _links="`echo "$_lynx_output" | wc -l`"
    _ext_links="`echo "$_lynx_output" | grep -v "${_url}" | wc -l`"
    echo "${_url}${_sep}${_header}${_sep}\"${_title}\"${_sep}\"${_description}\"${_sep}\"${_robots}\"${_sep}${_links}${_sep}${_ext_links}"
done < extract-website-info.txt >> extract-website-info.csv & spinner

# We delete our temporary file extract-website-info.txt
rm extract-website-info.txt

# End.
echo -e "Le fichier extract-website-info.csv a été généré. Le script est terminé."

Vous pouvez également le récupérer sur Github ou Gitlab. Par contre, ces versions sont traduites entièrement en anglais.

Divers avertissements

Je débute encore avec Bash, donc je ne prétends pas que ce script soit parfait. Au contraire, il est fort possible que le script nécessite des adaptations en fonction du site.

  • Plus votre site est gros, plus le temps de traitement sera long. Bash n’est peut-être pas le meilleur moyen de générer ces infos.
  • Il est peut-être possible d’optimiser le script pour que le temps de traitement soit moins long.
  • Pour utiliser le script Lynx doit être installé ; il est peut-être possible de se passer de Lynx pour utiliser des outils natifs. Comme j’utilise Lynx, je n’ai pas cherché.
  • Si vous n’avez pas les éléments meta description ou meta robot n’existent pas (ils peuvent être vide mais pas absents), le script ne sortira pas le résultat attendu, vous aurez des erreurs dans le document généré.
  • Si l’élément title n’est pas de la forme <title> (c’est à dire, s’il contient autre chose), de même il y aura des erreurs dans votre fichier.
  • Certains plugins de cache supprimer les doubles quotes (" ") des éléments meta description et meta robots si la minification du HTML est activée ; cela provoquera également des erreurs dans le fichier généré.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.