Esistono molti tool sulla rete per estrarre i link da una pagina web, ma non ne ho trovati altrettanti in grado di scansionare ricorsivamente tutte le pagine di un sito web e fornire in output una lista senza duplicati dei links presenti.
Questo script bash si può rivelare particolarmente utile quando sia necessario compilare una serie di redirect, per non perdere le indicizzazioni sui motori di ricerca di un sito che sia stato rinnovato. Un altro esempio di utilizzo è per controllare eventuali links interrotti, a questo scopo si può intergrare con il programma PHP che ho pubblicato qui: PHP cURL: una classe per controllare link interrotti, status code e nxdomain in parallelo
Lo script necessita che sia installato lynx che è un browser testuale. Questo programma, oltre naturalmente a permettere la navigazione del web su terminali ad interfaccia di comando, mette a disposizione anche una serie di opzioni allettanti per setacciare le pagine web. Nel caso abbiate una distribuzione Linux Ubuntu, l’installazione è molto semplice: sudo apt-get install lynx
. Altrettanto semplice l’installazione su CentOS: sudo yum install lynx
. Per tutte le ditribuzioni Linux (e anche per Windows!) comunque è disponibile il download dei pacchetti universali qui: http://lynx.invisible-island.net/lynx2.8.8/index.html
Lo script ha i seguenti 3 parametri:
- -u= (–url=) La URL del sito da processare. Esempio: -u=miosito.com
- -l= (–links=) Il tipo di links da estrarre internal: estrae solo in link interni, external: solo quelli esterni, se viene omesso vengono estratti tutti i links. Esempio -l=external
- -o= (–output=) Il nome del file di output, se viene omesso il default è: ‘extractlinks.out’. Esempio: -o=lista.txt
Premetto che non sono un bravo programmatore bash, dunque la scrittura del codice non è particolarmente raffinata, comunque visto che l’utilizzo sarà saltuario, come puro strumento di lavoro. Il codice:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | #!/bin/bash #First check if lynx is installed... type lynx >/dev/null 2>&1 || { echo >&2 "I require lynx but it's not installed. Aborting."; exit 1; } for i in "$@" do case $i in -u=*|--url=*) URL="${i#*=}" shift ;; -o=*|--output=*) OUT="${i#*=}" shift ;; -l=*|--links=*) LINKS="${i#*=}" shift ;; esac done if [ -z "$OUT" ] ; then OUT="extractlinks.out" fi if [[ $URL == *[/'!'@#$%^&*()_+:]* ]] ; then echo "Invalid url! It must contain only letters, numbers and dots" >&2 exit 1 fi DOTS=$(grep -o "." <<< "$URL" | wc -l) if [[ "$DOTS" < 1 ]] ; then echo "Invalid url!" >&2 exit 1 fi if [ ! -e "$OUT" ] ; then touch "${OUT}" else > "${OUT}" fi ESCAPEDURL=${URL//./\.} KEYURL=${ESCAPEDURL%\*} for i in $(lynx -dump -listonly 'http://'${URL}'/' | awk '/http/{print $2}' | grep http://${KEYURL}) do echo -ne "r |