Aspirer un site avec wget – CSS
Suite à un commentaire de Korbe (lien), il a été demandé si l’aspiration pouvait s’occuper des CSS. Apparemment ça devrait être implémenté dans une future version de wget.
En attendant, il est possible de le faire avec un petit script.
# Obtenir le contenu wget -r -k -E -np --limit-rate 1000 http://tar.get/wanted/directory/ # Obtenir la liste des fichiers dans CSS.txt # Cette ligne est à adapter en fonction de votre contenu: grep css ` find -type f ` | grep -v binaire | grep -v validator | grep stylesheet > CSS.txt
On va nettoyer le fichier :
gedit cure_list.awk
Et dans le fichier on met:
#! /bin/awk BEGIN{ # les séparateurs sont les guillemets FS="\"" } { for (i = 1; i <= NF; i++ ){ if ($i == " href=" ) { i = i + 1 print $i next } } }
Ensuite on exécute :
awk -f cure_liste.awk CSS.txt > CSS2.txt # On enlève les http pour les liens locaux. sed 's/http:\/\///' CSS2.txt > CSS3.txt
Maintenant il faut créer l'arborescence et chargez les fichiers.
gedit run_css.sh
Et on y met:
#! /bin/bash tab=$(more CSS3.txt) for add in $tab ; do # echo $add ; mkdir -p `dirname $add` ; # Ceci est peut être inutile done tab2=$(more CSS2.txt) for add in $tab2 ; do # On rajoute -c pour ne pas prendre 50 fois le même fichier wget -r -k -c -np $add ; done
Ensuite lancez la commande:
bash run_css.sh
On a récupéré les CSS, il faut maintenant modifier les fichiers HTML ou PHP récupéré.
gedit erease_link.sh &
Et on y met:
#! /bin/bash find -type f -name *.html > link.txt dir=$(pwd | sed 's/\//\\\//g') # on exécute pwd avec $() et on échappe les / avec le sed pour avoir par ex \/home\/user. # Merci à Tomzz pour l'astuce!!! forum-ubuntu.fr for add in $(more link.txt) ; do echo $add ; sed '/stylesheet/ s/http:\//${dir}/' $add > "$add"_bak if [ -s "$add"_bak ]; then mv "$add"_bak $add else rm "$add"_bak fi done rm link.txt echo "Job's done!"
On l'exécute :
bash erease_link.sh
Normalement, ça marche. Mais il faut voir qu'on ne va capturer que les CSS du site. Donc attention, que ça ne pointe pas vers des CSS sur d'autres domaines. Sinon la transformation des http:\ en pwd risque de faire mal.
La solution n'est pas portable. A moins de garder le même répertoire source ou de faire des liens symboliques sur la machine où on transfert le site aspiré.
D'autre part, ce qui est proposé ici peut être fait en un pas en concaténant les actions successives dans un seul fichier bash. Et même du point de vue de bash amélioré (merci ehmicky).
Par exemple:
<code>while read ; do echo "$REPLY" echo "${REPLY//http:\//$HOME}" > lavariablequetuveux done < <(find -type f -name *.html -exec cat {} \;)
N'hésitez pas à l'améliorer via les commentaires!