Le script va parser l’xml du site pour avoir la liste des pages, puis y accéder Suivant le script que vous allez utiliser, les dépendances des pages seront requeter ou non.
Charger de manière basique “juste” les pages
Cela peux se faire avec uniquement wget et egrep mais cela ne cachera pas les image, javascript css et autre fichiers. Cette solution n’utilisera pas d’espace disque.
wget --quiet http://domain.ltd/sitemap.xml -O - | egrep -o "http://domain\.ltd[^<]+" | wget --spider -nv -i -
N’oubliez pas de remplacer domain.ltd par votre domain 🙂
Si le sitemap a plusieurs niveaux
Cette fonction va suivre les redirections 30x ( http vers https par exemple ) elle permet aussi de parser plusieurs niveaux de sitemap, dans le cas ou il y a un index de sitemap.
http_crawler () {
BIN_DEPS='xml2 curl'
# === CHECKS ===
for BIN in `echo $BIN_DEPS`; do
which $BIN 1>/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "Error: Required binarie could not be found: $BIN"
return 1
fi
done
if [[ $# -eq 1 ]]; then
SITEMAPS=$(curl -s $1 -L | xml2 | grep '/loc=' | sed 's/.*=//' 2>/dev/null)
for URL in `echo $SITEMAPS`; do
if [[ $URL =~ '\.xml$' ]]; then
http_crawler $URL
else
HTTP_CODE=$(curl -s -w "%{http_code}" $URL -o /dev/null -L 2>/dev/null)
echo "$HTTP_CODE - $URL"
fi
done
return 0
else
echo usage: crawler domain.ltd/sitemap.xml >&2
return 1
fi
}
Script pour charger aussi les dépendances des pages
Pour tous crawler, vous pouvez utiliser le script ci-dessous, celui ci mettra en cache toutes les pages, image, css et js
#!/bin/sh
BIN_DEPS='wget awk grep cut'
# CHECKS
if [ "$1" = "" ]; then
echo "Usage : $0 domain.ltd"
exit 1
else
DOMAIN=$1
fi
for BIN in $BIN_DEPS; do
which $BIN 1>/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "Error: Required file could not be found: $BIN"
exit 1
fi
done
URLS=$(wget -q http://$DOMAIN/sitemap.xml -O - | awk -F'<loc>' '{print $2}' | awk -F '</loc>' '{ print $1 }' | grep -v ^$)
for URL in $URLS; do
PAGE=$(wget -q -O - $URL | grep -o -E 'href="([^"#]+)"' | cut -d'"' -f2 )
SRC=$(wget -q -O - $URL | grep -o -E 'src="([^"#]+)"' | cut -d'"' -f2 )
for LINK in $PAGE $SRC; do
if echo $LINK | grep $DOMAIN | grep -vi feed 1>/dev/null ; then
wget --domains=$DOMAIN -O/dev/null -nv $LINK
fi
done
done
Conclusion
Il me reste a fusionner les “features” des deux scripts/fonction pour que ce soit parfait ! 🙂