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 ait 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>.

###############################################################################
#
# MIT License

# Copyright (c) 2020 Armand Philippot

# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:

# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
###############################################################################

echo -e "This script allows you to extract the content of title, meta description and meta robots elements, header status and links number.\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 is installed, let's continue.\n"
else
    echo -e "Lynx is not installed. Please install it to use this script.\n"
    exit 2
fi

# We ask for the website to crawl
read -rp "Enter the website URL: " _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 "We are browsing the website to retrieve the URL list. It may take time, especially if your website has a lot.\n"
echo -e "Please wait.\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}Links number${_sep}External links number" >extract-website-info.csv

# We display a warning message.
echo -e "We process URLs. It may take time.\n"
echo -e "Please wait."

# We read each entry, we extract title and meta description and we write values in CSV file.
while read -r _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}' | sed -e '/^$/ d')"
    _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 -vc "${_url}")"
    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 "The file extract-website-info.csv was generated. End of script."

Vous pouvez également le récupérer sur Github ou Gitlab. Toutes les versions sont 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 les éléments meta description ou meta robots n’existent pas (ils peuvent être vides 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 suppriment 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.