Webseiten spiegeln: wget

20.11.2007

Das Tool wget bietet eine unglaubliche Funktionsfülle. Ich brauche es dazu, dynamisch erzeugte Webseiten zu archvieren.
Diese können nachher mit einem Browser als Dateien geöffnet werden, ohne Webserver. Dazu rufe ich wget folgendermassen auf:

wget -r -k -nv -E -e robots=off -l 0 http://server.ch/

Die interessanten Parameter sind:


  • -r : recursive, d.h. alle Seiten die verlinkt sind, ebenfalls wieder herunterladen.
  • -p : alle in der Seite verwendeten Graphiken mit herunter laden.
  • -H : span hosts, d.h. auch Dateien von anderen Servern als dem der angegeben ist, holen (in Kombination mit -r und -l n).
  • -k : fix links, d.h. die Links relativ zu machen so dass sie im Downloadverzeichnis stimmen.

  • -E : Dateien die vom Server als text/html ausgeliefert werden, erhalten die Erweiterung .html falls sie sie nicht schon haben. (Ohne -E lässt wget zum Beispiel die .php Erweiterung, was manche Browser nicht mögen, wenn sie Dateien öffnen sollen.)
  • -nv : non verbose, sonst macht wget sehr ausführliche Fortschrittsanzeigen
  • -l : maximale Anzahl Links, die nacheinander Verfolgt werden. 0 bedeutet keine Limite. (Achtung, -l 0 sollte nicht mit -H kombiniert werden, sonst kann es passieren dass man versucht das ganze Internet lokal zu kopieren :-)
  • -D : Domain aus der die Dateien kommen sollen, d.h. nur Links folgen die auf einer der auf -D folgenden Domains verweisen.
  • -e : Befehl ausführen. Wird hier gebraucht um die Datei robots.txt zu ignorieren, da ich auch Verzeichnisse spiegeln will, die von Suchmaschinen nicht durchsucht werden.
  • -np : no parent, Niemals Links folgen, die Verzeichnisse heraufgehen (z.B. href="../"). Sinnvoll um nur ein Teilbereich einer Site zu spiegeln.


In Version 1.8.1 hat wget zwei Probleme bei diesem Einsatzgebiet:


Erstens interpretiert es css nicht, dass heisst Hintergrundbilder die im Stil von style="background-image:url(img/bg.jpg)" referenziert sind, werden nicht heruntergeladen.

Zweitens sind die resultierenden Dateien nicht ganz perfekt: Fragezeichen im Query-String als ? im Dateinamen. Unter Linux ist das Legal aber ungewöhnlich, unter Windows (FAT) unmöglich. Weiter werden Leerzeichen ja als %20 kodiert. Wenn aber ein Browser auf das Filesystem zugreift, wird %20 als Leerzeichen betrachtet und die Datei nicht gefunden.

Das Problem mit ungültigen Zeichen im Dateinamen löse ich mit dem Shellskript fixwget. Es ersetzt ?, %20 und kümmert sich darum, Stylesheets die nicht die Endung .css haben, umzubenennen.



fixwget kann als Attachment dieser Seite heruntergeladen werden. Kopieren mit mv fixwget.txt /usr/local/bin/fixwget und mit chmod a+x /usr/local/bin/fixwget ausführbar machen. Das Skript wird ohne Parameter im Verzeichnis der heruntergeladenen Webseite aufgerufen. Achtung, das Skript ist nicht sehr effizient. Für grössere Seiten wird es einige Minuten laufen...

Anmerkung (die nichts mit wget zu tun hat, aber mit Fragezeichen im Dateinamen): Diese Fragezeichen müssen nicht zwingend das ASCII-Zeichen ? bedeuten, sondern können auch für ein mit dieser Zeichentabelle nicht darstellbares Symbol stehen. Wer so eine Datei von Windows aus über Samba anschaut, sieht statt dem Fragezeichen ein kleines Viereck.



Eine weiterer Aufruf, um z.B. die Bilder aus einer Bildergalerie alle verlinkten Bilder herunterzuladen:

wget -r -nv -nd -np -l 2 -Dserver.ch http://www.server.ch/thumbnailpage.htm

Wobei thumbnailpage.htm die Seite mit den kleinen Vorschaubildchen ist, die als Links auf die eigentlichen Bilder gemacht sind. Danach kann man die html, css und ev. weitere Dateien entfernen. Folgende zusätzliche Parameter werden gebraucht:


  • -nd : no directories, es wird kein Verzeichnis erstellt, alle Dateien landen im Verzeichnis wo wget aufgerufen wurde. Achtung: wenn die Thumbnails und die Bilder genau gleiche Dateinamen haben (aber auf dem Server halt in verschiedenen Verzeichnissen), -nd weglassen sonst geht es nicht.
  • -l 2 : Rekursionstiefe 2, das heisst maximal 2 Links folgen. So werden auch Bilder heruntergeladen, falls die Links auf Webseiten mit den grossen Bildern verweisen und nicht auf Bilddateien direkt.
  • -np : No parent, also in der Verzeichnishierarchie aufsteigen (sonst kann es passieren dass recht viel heruntergeladen wird.) Funktioniert natürlich nur, wenn die Bilder in einem Verzeichnis unter der Thumbnailwebseite sind.

Downloads

fixwget.txt (kopieren nach /usr/local/bin und ausführbar machen)

web shell linux