Wie verwenden Sie WGET, um eine Site mit einer Tiefe von 1 Ebene zu spiegeln und JS- und CSS-Ressourcen einschließlich CSS-Images wiederherzustellen?

11

Stellen Sie sich vor, ich möchte, dass eine einfache Seitenkopie zur dauerhaften Aufbewahrung auf meine Festplatte heruntergeladen wird. Ich suche nicht nach einem tiefen rekursiven Abruf, sondern nur nach einer einzelnen Seite, sondern auch nach Ressourcen, die von dieser Seite geladen werden, um auch heruntergeladen zu werden.

Beispiel: https://www.tumblr.com/

Erwarten von:

  • Die index.html
  • Alle geladenen Bilder
  • Alle geladenen JS-Dateien
  • Alle geladenen CSS-Dateien
  • Alle in die CSS-Datei geladenen Bilder
  • Links für die Seitenressourcen, die lokalisiert sind, um mit den heruntergeladenen Kopien zu arbeiten (keine Webabhängigkeit)

Ich bin interessiert zu wissen, ob Sie mir helfen können, die beste Wget-Syntax oder ein anderes Tool zu finden, das dies ermöglicht. Die Tools, die ich ausprobiert habe, können die Bilder normalerweise nicht per CSS laden, sodass die Seite beim lokalen Laden nie richtig aussieht. Vielen Dank!

Tangentenlösung

Ich habe einen Weg gefunden, dies mit FireFox zu tun. Die Standardspeicherung ist fehlerhaft und es gibt ein Addon namens "Save Complete", das anscheinend gute Arbeit leisten kann. Sie können es jedoch nicht herunterladen, da es in der aktuellen FireFox-Version nicht unterstützt wird. Der Grund ist, dass es in dieses Addon gerollt wurde: "Mozilla Archive Format". Installieren Sie das. Wenn Sie dann Datei> "Seite speichern unter ..." verwenden, gibt es eine neue Option namens "Webseite, abgeschlossen", die im Wesentlichen das alte Addon ist, das die von FireFox verwendete Standardimplementierung behebt (was schrecklich ist). Dies ist keine WGET-Lösung, bietet jedoch eine praktikable Lösung.

EDIT: Ein weiteres lächerliches Problem für jeden, der diese Frage in Zukunft möglicherweise verfolgt und versucht, dies zu tun. Damit das Addon ordnungsgemäß funktioniert, müssen Sie Extras> Mozilla-Archivformat verwenden und die (schreckliche) Standardeinstellung "Erstellen Sie einen originalgetreuen Schnappschuss der Seite" in "Skripte und Quelle mit Save Complete beibehalten" ändern, da sonst das Addon alle leer macht Ihre Skriptdateien und ersetzen Sie sie durch den Text "/ * Skript durch Snapshot-Speichern entfernt * /".

Lana Miller
quelle
Datei> Speichern unter Firefox oder einem anderen Browser lädt alle Bilder, JS- und CSS-Dateien
herunter
Möchten Sie die Dateien tatsächlich oder möchten Sie nur eine korrekt gerenderte Version der Seite?
Ich möchte die Dateien, sie müssten die Seite trotzdem korrekt rendern. Wenn Sie sie nicht hätten, würde es anders aussehen. Datei> Speichern unter funktioniert in Firefox nicht. Wenn Sie dies tun, erhalten Sie keine CSS-Bilder. Probieren Sie es unter tumblr.com/login aus . Hintergrundbild fehlt, Hintergrundbild für Eingabefelder fehlt.
Keine der wget-Lösungen hat bei mir funktioniert. Meine Tangentenlösung ist die beste Methode, um diese Art der Site-Speicherung zu erreichen. Ich habe jedoch gesehen, dass es auf sehr komplizierten Seiten wie apple.com fehlschlägt , vermutlich weil viele der Ressourcenpfade dynamisch durch die Ausführung von Javascript generiert werden, einige nicht sofort, sondern während einer Art Ajax-Ausführung.
Lana Miller

Antworten:

12

wget -p -k http://ExampleSite.com

Mit -p erhalten Sie alle erforderlichen Elemente, um die Site korrekt anzuzeigen (CSS, Bilder usw.). Das -k ändert alle Links (einschließlich der für CSS und Bilder), damit Sie die Seite offline anzeigen können, wie sie online angezeigt wird.

Update: Dies ist spezifisch für Ihre Beispielseite: tumblr.com

wget -H -N -k -p --exclude-domains quantserve.com --no-check-certificate -U "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0a2) Gecko/20110613 Firefox/6.0a2" https://www.tumblr.com

Die Panne:

-H = Ermöglicht es wget, einen fremden Host zu überspannen. Erforderlich, da Tumblr seine Bilder nicht auf der Startseite unter derselben Adresse hat, verwenden sie Secure.assets.tumblr.com ( siehe Hinweis zum Ausschließen von Domains)

-N = greift nur auf Dateien zu, die neuer sind als das, was Sie derzeit haben, falls Sie im Laufe der Zeit dieselbe Seite erneut herunterladen

-k = Konvertiere deine Links, um sie offline richtig anzuzeigen

-p = greift nach allen erforderlichen Elementen, um sie korrekt anzuzeigen (CSS, Bilder usw.)

--exclude-Domains = Da die tumblr.com-Homepage einen Link für quantserve.com enthält und ich vermute, dass Sie dieses Zeug nicht wollen, müssen Sie es von Ihrem Wget-Download ausschließen. Hinweis : Dies ist eine ziemlich wichtige Option, die Sie mit -H verwenden sollten, denn wenn Sie zu einer Website gehen und diese mehrere Links für externe Hosts enthält (denken Sie an Werbetreibende und Analytics), werden Sie sich diese auch schnappen!

--no-check-certificate erforderlich, da tumblr https verwendet

-U ändert den Benutzeragenten. In diesem Fall nicht wirklich notwendig, da es den Standard-Wget-Benutzeragenten zulässt, aber ich weiß, dass einige Websites ihn blockieren werden. Ich habe es nur hier reingeworfen, falls Sie auf anderen Websites auf Probleme stoßen. In dem Beispiel-Snippet, das ich gegeben habe, erscheint es als Mozilla Firefox 6.02a

Endlich haben Sie die Seite: https://www.tumblr.com


quelle
1
Ich habe es versucht, keine JS- oder CSS- oder Bilddateien erhalten. Hast du?
Wenn Sie es auf tumblr verwenden (Ihr Beispiel oben), müssen Sie möglicherweise --no-check-certificate angeben.
Ich denke du hast recht, es braucht wahrscheinlich diese Option. Immer noch nichts außer index.html. Etwas fehlt ...
@LanaMiller Ich habe meine Antwort aktualisiert. Lassen Sie mich wissen, wenn es irgendwelche Probleme gibt.
Könnten Sie nicht so etwas wie -exclude-domain! = Tumblr.com tun?
Alpha1
3

Für die spezifische Site, die Sie erwähnt haben, und viele andere, die so codiert sind, dass sie nicht funktionieren, funktioniert wget (und curl) einfach nicht. Das Problem ist, dass einige der zum Rendern der Seite in einem Browser erforderlichen Asset-Links selbst über Javascript erstellt werden. Wget hat eine Funktionsanforderung anhängig, um Javascript auszuführen:

http://wget.addictivecode.org/FeatureSpecifications/JavaScript

Bis dahin sind Websites, die Asset-Links mit Javascript erstellen, mit wget nicht klonbar. Die einfachste Lösung besteht darin, ein Tool zu finden, das tatsächlich ein DOM erstellt und Javascript wie eine Browser-Engine analysiert (dh die von Ihnen erwähnte Firefox-Methode).

Polynom
quelle
1

Sie können dies auch automatisch (oder programmgesteuert, wenn Sie codieren) tun, indem Sie mit wget einen Befehl über die Shell ausgeben:

wget --convert-links -r http://www.yourdomain.com

Es lädt die Seite und die internen Dateien herunter und macht die Links lokal.

Jhourlad Estrella
quelle
1
Das wird alles bekommen . Lies die Frage.
Evgeny
-1
wget -r http://www.example.com

Ich denke, das wird alles packen, aber probieren Sie es aus und finden Sie es heraus.


quelle
1
Es bekommt alles was viel zu viel ist. Bisher ist die von mir gefundene FireFox-Lösung die am besten funktionierende Lösung. Es bekommt was Sie brauchen und nichts mehr.
-1

$ ( man wget ):

-p

--Seitenvoraussetzungen

Diese Option veranlasst Wget, alle Dateien herunterzuladen, die zum ordnungsgemäßen Anzeigen einer bestimmten HTML-Seite erforderlich sind. Dazu gehören beispielsweise Inline-Bilder, Sounds und referenzierte Stylesheets.

Normalerweise werden beim Herunterladen einer einzelnen HTML-Seite nicht alle erforderlichen Dokumente heruntergeladen, die zur ordnungsgemäßen Anzeige erforderlich sind. Die Verwendung von -r zusammen mit -l kann helfen, aber da Wget normalerweise nicht zwischen externen und inline-Dokumenten unterscheidet, bleiben im Allgemeinen Blattdokumente übrig, denen die erforderlichen Anforderungen fehlen.

Angenommen, Dokument 1.html enthält ein "<IMG>" - Tag, das auf 1.gif verweist, und ein "<A>" - Tag, das auf ein externes Dokument 2.html verweist. Angenommen, 2.html ist ähnlich, das Bild ist jedoch 2.gif und es wird auf 3.html verwiesen. Angenommen, dies setzt sich bis zu einer willkürlich hohen Zahl fort.

Wenn man den Befehl ausführt:

wget -r -l 2 http: // <site> /1.html

dann werden 1.html, 1.gif, 2.html, 2.gif und 3.html heruntergeladen. Wie Sie sehen können, ist 3.html ohne das erforderliche 3.gif, da Wget einfach die Anzahl der Hops (bis zu 2) von 1.html entfernt zählt, um zu bestimmen, wo die Rekursion gestoppt werden soll. Mit diesem Befehl jedoch:

wget -r -l 2 -p http: // <Site> /1.html

Alle oben genannten Dateien und das erforderliche 3.gif von 3.html werden heruntergeladen. Ähnlich,

wget -r -l 1 -p http: // <Site> /1.html

bewirkt, dass 1.html, 1.gif, 2.html und 2.gif heruntergeladen werden. Man könnte denken, dass:

wget -r -l 0 -p http: // <Site> /1.html

würde nur 1.html und 1.gif herunterladen, aber leider ist dies nicht der Fall, da -l 0 gleich -l inf --- ist, dh unendliche Rekursion. Um eine einzelne HTML-Seite (oder eine Handvoll davon, die alle in der Befehlszeile oder in einer -i-URL-Eingabedatei angegeben sind) und ihre (oder ihre) Anforderungen herunterzuladen, lassen Sie einfach -r und -l weg:

wget -p http: // <site> /1.html

Beachten Sie, dass sich Wget so verhält, als wäre -r angegeben worden, aber nur diese einzelne Seite und ihre erforderlichen Daten werden heruntergeladen. Links von dieser Seite zu externen Dokumenten werden nicht verfolgt. Um eine einzelne Seite und alle erforderlichen Elemente herunterzuladen (auch wenn sie auf separaten Websites vorhanden sind) und sicherzustellen, dass das Los lokal ordnungsgemäß angezeigt wird, verwendet dieser Autor zusätzlich zu -p einige Optionen:

wget -E -H -k -K -p http: // <Site> / <Dokument & gt ;

Um dieses Thema abzuschließen, sollten Sie wissen, dass Wgets Idee eines externen Dokumentlinks eine beliebige URL ist, die in einem "<A>" - Tag, einem "<AREA>" - Tag oder einem anderen "<LINK>" - Tag als "<" angegeben ist LINK REL = "Stylesheet"> ".

James Sumners
quelle
2
Welcher Teil davon ähnelt Ihrer Meinung nach der Lösung? Weil ich versucht habe, den Inhalt der Manpage zu lesen, und hier nicht die richtige Lösung sehe. Hast du irgendetwas davon selbst versucht? Was denken Sie, ist der Befehl, der die Frage spezifisch anspricht?