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!


Vus : 1040
Publié par Boutor : 56