Faire une capture d'une page web avec un script bash

Il m’arrive souvent de tomber sur une page web intéressante et de vouloir la conserver pour la relire plus tard.

J’ai déjà un partage de bookmarks qui me permet de conserver les adresses et de les partager mais aussi la synchronisation des bookmarks avec Firefox pour ceux que je ne souhaite pas rendre publique.

Le problème de temps en temps, c’est que la page disparaît, parfois parce que l’auteur ne souhaite plus la rendre publique, ou alors parce que l’hébergement a été modifié (migration, nettoyage un peu trop radicale, …).

Pour éviter de me retrouver déçu ne plus pouvoir relire la page, j’utilise un script pour faire une copie de la page sur mon serveur.

Sur la dernière version de mon serveur j’utilisais le script php respawn mais voulant rendre mon serveur le plus light possible (simple et stupide), j’ai décidé de réaliser un petit script en bash avec wget.

Le principe du script est le suivant:

  • Récupère la page avec les options adéquates avec wget pour qu’il récupère les images, css et javascript nécessaires à l’affichage de la page et modifie ces liens.
  • Récupère le path du fichier enregistré et converti (liens css/javascript)
  • Récupère le titre de la page html
  • Transforme l’url avec l’encodage html des caractères spéciaux dans le lien
  • Ajoute un lien au fichier lists.html avec les informations précédentes

Pour le lancer rien de plus simple:

./spider.sh "https://systemd.info/journal/2014-02-16/faire_un_mirroir_d_une_page_web_avec_un_script_bash"

ci-joint le script:

spider.sh

#!/usr/local/bin/bash
url="$1"
filepath=`echo $url | awk -F:// '{print $2}'`
date=`date '+%d-%m-%Y'`
epoch=`date +%s`
echo "Mirroring $url"
wget --adjust-extension --directory-prefix=$epoch --span-hosts --convert-links --page-requisites -e robots=off $url -o output
filepath_converted=`cat output | grep Converting | head -n1 | sed -n "s/Converting \(.*\)\.\.\..*/\1/p"`
if [ -n "$filepath_converted" ]; then
    filepath=$filepath_converted
else
    filepath=$epoch/$filepath
fi
echo "Saved to $filepath"
title=`cat $filepath | sed -n "s/.*\<title\>\([^<]*\).*/\1/p"`
if [ -z "$title" ]; then
    title=$filepath
fi
sed '$ d' list.html > temp ; mv temp list.html # remove last line (html)
link="$(perl -MURI::Escape -e 'print uri_escape($ARGV[0],"^A-Za-z0-9\-\._~\/");' "$filepath")"
echo "<a href=\"$link\">$title</a> <i>from $url $date</i><br>" >> list.html
echo "</body></html>" >> list.html
rm output 

Et voici le résultat:

https://systemd.info/files/mirrors/