Charger votre site dans le cache Varnish grace a son sitemap.xml

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>&amp;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 ! 🙂


Suggestions de lecture :

comments powered by Disqus