Ich habe mich kürzlich intensiv mit dem Thema Website-Archivierung befasst. Ich wurde von Freunden gefragt, die Angst hatten, die Kontrolle über ihre Arbeit im Internet aufgrund schlechter Systemadministration oder feindlicher Löschung zu verlieren. Solche Bedrohungen machen die Website-Archivierung zu einem wichtigen Werkzeug für jeden Systemadministrator. Wie sich herausstellte, sind einige Websites viel schwieriger zu archivieren als andere. Dieser Artikel beschreibt den Prozess der Archivierung traditioneller Websites und zeigt, wie dies bei trendigen Anwendungen mit nur einer Seite, die das moderne Web unterstützen, nicht funktioniert.
Einfache Sites konvertieren
Die Zeiten, in denen Websites manuell in HTML geschrieben wurden, sind lange vorbei. Jetzt sind sie dynamisch und werden im Handumdrehen mit den neuesten JavaScript-, PHP- oder Python-Frameworks erstellt. Infolgedessen sind Websites anfälliger geworden: Datenbankabstürze, falsche Aktualisierungen oder Sicherheitslücken können zu Datenverlust führen. In meinem früheren Leben als Webentwickler musste ich mich mit der Idee abfinden: Kunden erwarten, dass Websites für immer funktionieren. Diese Erwartung passt nicht gut zum Prinzip der Webentwicklung "schnell gehen und Dinge kaputt machen". Die Arbeit mit dem
Drupal- Content-Management-System erwies sich in dieser Hinsicht als besonders schwierig, da große Updates absichtlich die Kompatibilität mit Modulen von Drittanbietern verletzen, was einen teuren Update-Prozess impliziert, den sich Kunden selten leisten können. Die Lösung bestand darin, diese Websites zu archivieren: Nehmen Sie eine lebendige, dynamische Website - und verwandeln Sie sie in einfache HTML-Dateien, die jeder Webserver für immer bereitstellen kann. Dieser Prozess ist nützlich für Ihre eigenen dynamischen Websites sowie für Websites von Drittanbietern, die außerhalb Ihrer Kontrolle liegen und die Sie schützen möchten.
Das ehrwürdige
Wget- Programm leistet hervorragende Arbeit mit einfachen oder statischen Websites. Obwohl Sie einen echten Zauber brauchen, um die gesamte Site zu spiegeln:
$ nice wget --mirror --execute robots=off --no-verbose --convert-links \ --backup-converted --page-requisites --adjust-extension \ --base=./ --directory-prefix=./ --span-hosts \ --domains=www.example.com,example.com http://www.example.com/
Dieser Befehl lädt den Inhalt der Webseite und crawlt auch alle Links in den angegebenen Domänen. Berücksichtigen Sie die möglichen Folgen des Crawls, bevor Sie diese Aktion auf Ihrer bevorzugten Website starten. Der obige Befehl ignoriert absichtlich die
robots.txt- Regeln, wie sie jetzt
für Archivare üblich sind , und lädt die Site mit maximaler Geschwindigkeit herunter. Die meisten Crawler haben Optionen zum Anhalten zwischen Anrufen und Bandbreitenbeschränkungen, um die Zielsite nicht übermäßig zu belasten.
Dieser Befehl empfängt auch "Seitendetails", dh Stylesheets (CSS), Bilder und Skripte. Der geladene Inhalt der Seite ändert sich, sodass die Links auf eine lokale Kopie verweisen. Der resultierende Satz von Dateien kann auf jedem Webserver gehostet werden, der eine statische Kopie der ursprünglichen Website darstellt.
Aber dann geht alles gut. Jeder, der jemals mit einem Computer gearbeitet hat, weiß, dass die Dinge selten nach Plan verlaufen: Es gibt viele interessante Möglichkeiten, den Vorgang zu stören. Zum Beispiel war es vor einiger Zeit in Mode, Blöcke mit einem Kalender auf Websites zu platzieren. CMS generiert sie im laufenden Betrieb und sendet Crawler in einen endlosen Zyklus, um immer mehr neue Seiten zu erhalten. Heikle Archivare können reguläre Ausdrücke verwenden (z. B. hat Wget die Option
--reject-regex
), um problematische Ressourcen zu ignorieren. Eine weitere Option: Wenn die Website-Verwaltungsoberfläche verfügbar ist, deaktivieren Sie Kalender, Anmeldeformulare, Kommentarformulare und andere dynamische Bereiche. Sobald die Site statisch wird, funktionieren sie ohnehin nicht mehr. Daher ist es sinnvoll, dieses Durcheinander von der ursprünglichen Site zu entfernen.
JavaScript-Albtraum
Leider sind einige Websites viel mehr als nur HTML. Beispielsweise erstellt der Webbrowser auf Websites mit nur einer Seite selbst Inhalte, indem er ein kleines JavaScript-Programm ausführt. Ein einfacher Benutzeragent wie Wget versucht erfolglos, eine aussagekräftige statische Kopie dieser Websites wiederherzustellen, da JavaScript überhaupt nicht unterstützt wird. Theoretisch sollten Websites eine
schrittweise Verbesserung unterstützen, damit auf Inhalte und Funktionen ohne JavaScript
zugegriffen werden kann . Diese Anweisungen werden jedoch nur selten befolgt, wie jeder, der Plugins wie
NoScript oder
uMatrix verwendet, bestätigt .
Herkömmliche Archivierungsmethoden scheitern manchmal auf die dümmste Weise. Als ich versuchte, eine
lokale Zeitung zu sichern
, stellte ich fest, dass WordPress am Ende des
?ver=1.12.4
(z. B.
?ver=1.12.4
)
?ver=1.12.4
. Dies ist verwirrend, um den Inhaltstyp auf Webservern zu erkennen, die das Archiv bedienen, da sie auf die Dateierweiterung angewiesen sind, um den richtigen
Content-Type
Header zu erstellen. Wenn ein solches Archiv in den Browser heruntergeladen wird, kann es keine Skripte laden, wodurch dynamische Websites beschädigt werden.
Da der Browser allmählich zu einer virtuellen Maschine für die Ausführung von beliebigem Code wird, sollten Archivierungsmethoden, die auf einer reinen HTML-Analyse basieren, angepasst werden. Die Lösung für diese Probleme besteht darin, die vom Server während des Crawls bereitgestellten HTTP-Header aufzuzeichnen (und abzuspielen). Wirklich professionelle Archivare verwenden diesen Ansatz.
Erstellen und Anzeigen von WARC-Dateien
Im
Internetarchiv entwickelten Brewster Calais und Mike Burner 1996 das
ARC- Format (ARChive): eine Möglichkeit, Millionen kleiner Dateien zu kombinieren, die während der Archivierung erstellt wurden. Am Ende wurde das Format als WARC-
Spezifikation (Web ARChive) standardisiert, 2009 als ISO-Standard veröffentlicht und 2017 überarbeitet. Standardisierungsbemühungen unter Leitung des
International Conservation Consortium (IIPC). Laut Wikipedia handelt es sich um eine „internationale Organisation von Bibliotheken und anderen Organisationen, die gegründet wurde, um die Bemühungen zur Erhaltung von Internetinhalten für die Zukunft zu koordinieren“, und umfasst Mitglieder wie die Library of Congress und das Internet Archive. Letzterer verwendet das WARC-Format in seinem Heritrix Java-
Crawler .
Eine WARC-Datei kombiniert mehrere Ressourcen in einem komprimierten Archiv, z. B. HTTP-Header, Dateiinhalte und andere Metadaten. Praktischerweise wird dieses Format auch vom Wget-Crawler mit der
--warc
. Leider können Browser WARC-Dateien nicht direkt anzeigen, sodass für den Zugriff auf das Archiv ein spezieller Viewer erforderlich ist. Oder du musst es konvertieren. Der einfachste Viewer, den ich gefunden habe, ist
pywb , ein Python-Paket. Es wird ein einfacher Webserver mit einer Schnittstelle wie Wayback Machine gestartet, um den Inhalt von WARC-Dateien anzuzeigen. Mit den folgenden Befehlen wird die WARC-Datei
http://localhost:8080/
: zugeordnet.
$ pip install pywb $ wb-manager init example $ wb-manager add example crawl.warc.gz $ wayback
Übrigens haben die Entwickler des
Webrecorder- Dienstes dieses Tool erstellt, mit dem der dynamische Inhalt der Seite mithilfe eines Browsers
gespeichert wird .
Leider kann pywb keine von Wget generierten WARC-Dateien laden, da es
den falschen Anforderungen der WARC 1.0-Spezifikation entspricht , die
in Version 1.1 behoben wurden. Bis Wget oder pywb diese Probleme beheben, sind die von Wget erstellten WARC-Dateien nicht zuverlässig genug, daher habe ich persönlich nach anderen Alternativen gesucht. Meine Aufmerksamkeit wurde auf den Crawler unter dem einfachen Namen
crawlen gelenkt. So fängt es an:
$ crawl https://example.com/
Das Programm unterstützt einige Befehlszeilenparameter, aber die meisten Standardwerte sind recht funktional: Es lädt Ressourcen wie CSS und Bilder aus anderen Domänen herunter (wenn das
-exclude-related
nicht angegeben ist), aber die Rekursion geht nicht über den angegebenen Host hinaus. Standardmäßig werden zehn gleichzeitige Verbindungen gestartet: Dieser Parameter wird mit dem Flag
-c
geändert. Am wichtigsten ist jedoch, dass die resultierenden WARC-Dateien in pywb einwandfrei geladen werden.
Zukünftige Arbeit und Alternativen
Es gibt viele
Ressourcen für die Verwendung von WARC-Dateien. Insbesondere gibt es ein Ersatz-Wget namens
Wpull , das speziell für die Archivierung von Websites entwickelt wurde. Es bietet experimentelle Unterstützung für
PhantomJS und die Integration in
youtube-dl , wodurch Sie komplexere JavaScript-Websites bzw. Streaming-Medien herunterladen können. Das Programm ist die Grundlage des
ArchiveBot- Archivierungswerkzeugs, das vom "freien Team schelmischer Archivare, Programmierer, Schriftsteller und Sprecher" von
ArchiveTeam entwickelt wird , um "die Geschichte zu speichern, bevor sie für immer verschwindet". Es scheint, dass die PhantomJS-Integration nicht so gut ist, wie wir es uns wünschen. Daher verwendet ArchiveTeam eine Reihe anderer Tools, um komplexere Websites zu spiegeln. Beispielsweise scannt
snscrape Social-Media-Profile und generiert Listen mit Seiten, die an ArchiveBot
gesendet werden sollen . Ein weiteres Tool ist
crocoite , mit dem Chrome im Headless-Modus ausgeführt wird, um Websites mit viel JavaScript zu archivieren.
Dieser Artikel wäre unvollständig, ohne die „Xerox-Sites“ von
HTTrack zu erwähnen. Wie Wget erstellt das HTTrack-Programm lokale Kopien von Sites, unterstützt jedoch leider nicht das Speichern in WARC. Interaktive Funktionen sind möglicherweise für Anfänger interessanter, die mit der Befehlszeile nicht vertraut sind.
In der gleichen Weise fand ich während meiner Recherche eine Alternative zu Wget namens
Wget2 mit Unterstützung für Multithread-Arbeit, die das Programm beschleunigt. Hier fehlen jedoch
einige Wget-
Funktionen , einschließlich Vorlagen, Speichern in WARC- und FTP-Unterstützung, aber RSS-Unterstützung, DNS-Caching und verbesserte TLS-Unterstützung wurden hinzugefügt.
Mein persönlicher Traum für solche Tools wäre es schließlich, sie in mein bestehendes Lesezeichen-System zu integrieren. Ich speichere derzeit interessante Links in
Wallabag , einem lokalen Speicherdienst für interessante Seiten, der als Alternative zum kostenlosen
Pocket- Programm (jetzt im Besitz von Mozilla) entwickelt wurde. Wallabag erstellt in seinem Design jedoch nur eine „lesbare“ Version des Artikels anstelle einer vollständigen Kopie. In einigen Fällen ist die „lesbare Version“ tatsächlich nicht
lesbar , und Wallabag
kann das Parsen manchmal
nicht verarbeiten . Stattdessen speichern andere Tools, wie z. B.
Lesezeichen-Archivierungsprogramm oder
Reminescence , einen Screenshot der Seite zusammen mit vollständigem HTML-
Code , unterstützen jedoch leider nicht das WARC-Format, das eine noch genauere Wiedergabe ermöglichen würde.
Die traurige Wahrheit meiner Spiegelung und Archivierung ist, dass Daten sterben. Glücklicherweise verfügen Amateurarchivare über die Tools, um interessante Inhalte im Internet zu speichern. Für diejenigen, die dies nicht alleine tun möchten, gibt es ein Internetarchiv sowie die ArchiveTeam-Gruppe, die daran
arbeitet, eine Sicherungskopie des Internetarchivs selbst zu erstellen .