Kage – Ein Tool zum Entfernen von JavaScript von Websites und zur Offline-Archivierung
(github.com/tamnd)- Rendert Seiten mit Headless Chrome, erstellt einen Snapshot des finalen DOM, wie ihn ein Mensch sehen würde, entfernt anschließend sämtliches JavaScript und lädt CSS, Bilder und Schriftarten in lokale Pfade herunter, um eine statische Kopie zu erzeugen, die ohne Code funktioniert
- Löst das Problem, dass per „Save As“ gespeicherte Seiten mit der Zeit kaputtgehen und nur noch einen leeren Bildschirm, einen eingefrorenen Spinner oder fehlgeschlagene Verbindungsversuche zu verschwundenen Analytics-Servern zeigen
- Bietet
.html-Dateien, die sich direkt von der Festplatte öffnen lassen – ohne Tracking, Netzwerkaufrufe oder unerwartetes Verhalten
- Bietet
- Verwendet Breadth-First-Crawling, liest
robots.txt, nimmtsitemap.xmlals Ausgangspunkt und bleibt beim Seed-Host- Dank Idempotenz wird dieselbe Seite nur einmal geholt, unabhängig davon, ob sie per http oder https aufgerufen wird oder ob ein Trailing Slash vorhanden ist
- Speichert bei Ctrl-C den Fortschritt, setzt ihn beim erneuten Start fort, rendert mit
--refreshneu und startet mit--forcevon vorn
- Bietet Flags zur Steuerung von Crawl-Umfang und Verhalten wie
--max-pages,--max-depth,--scope-prefix,--subdomains,--scrollund--workers - Mit
kage packlässt sich die Kopie in eine einzelne Datei packen – wahlweise als ZIM-Archiv oder als eigenständige ausführbare Datei, die selbst als Website fungiert- ZIM ist mit dem Kiwix-Ökosystem kompatibel und kann auch in
kiwix-servesowie in den Kiwix-Desktop- und Mobile-Apps angezeigt werden - Für das eigenständige Binary muss der Empfänger nichts installieren; mit
--baselässt sich zudem ein Viewer für andere Betriebssysteme erzeugen (ca. 13 MiB + Größe der Website)
- ZIM ist mit dem Kiwix-Ökosystem kompatibel und kann auch in
- Durch deterministisches Packing erzeugt dieselbe Kopie immer byte-identische Dateien; die Archiv-UUID wird aus dem Inhalt abgeleitet und ist sicher für Checksummen und Caches
- Beim Build mit dem Tag
webviewwird das OS-WebView (WKWebView, WebView2, WebKitGTK) verwendet, sodass die Seite in einem eigenen Fenster statt in einem Browser-Tab geöffnet wird - Verarbeitungspipeline: Seed-URL → Rendering mit Headless Chrome → finaler DOM-Snapshot → JS entfernen → Assets lokalisieren → auf Festplatte speichern
- MIT-Lizenz
1 Kommentare
Hacker-News-Kommentare
Ich fand es interessant, wie das Demo-GIF im README erstellt wurde, und habe nachgesehen: https://github.com/tamnd/kage/blob/01e75b87ecc893bbba7943c63...
Es stellt sich heraus, dass dafür ein anderes Projekt desselben Autors verwendet wird: https://github.com/tamnd/ascii-gif
Das im Demo verwendete Skript liegt hier: https://github.com/tamnd/kage/blob/01e75b87ecc893bbba7943c63..., und die Ausführung ist ebenfalls als Kommentar beschrieben:
ascii-gif render docs/demo/kage.tape -o docs/static/demo.gifSieht aus wie ein meinungsstarker Wrapper um https://github.com/charmbracelet/vhs
$HOME/bin/. Dinge wiedelete-all-npm,clean-rust-cache,download-youtube-playlistundget-markdown; es ist schön, sich die Befehle nicht merken zu müssenManchmal findet ein Coding-Agent sogar selbst heraus, wie solche Tools aufzurufen sind
Das könnte nützlich sein, wenn man ein Unternehmens-Wiki auch offline leicht zugänglich machen möchte. Zum Beispiel könnte es auf einem Einsatzort ohne Mobilfunksignal hilfreiche Dokumentation im Wiki geben
Dass sich eine ganze Website in eine einzelne Binärdatei bündeln lässt, ist cool, aber eine Version ohne separaten Serving-Prozess wäre besonders gut
Es scheint auch möglich zu sein, das als eine Art einzelne HTML-Einstiegs-Shim mit etwas JavaScript umzusetzen, mit dem sich das archivierte Site-Content durchsuchen lässt, idealerweise in eingebetteter Form
Ich habe bereits ein Skript/Programm im Kopf, das HTML in Markdown umwandelt, also könnte man tatsächlich alles als Markdown-Dateiordner auf der Festplatte speichern und dann in ein Git-Repository committen
Das ist großartig. Ich wollte schon länger den Prototypen von jemandem aus so etwas wie Lovable als Offline-Kopie herunterladen, um Versionierung und Teilen in einem einfacheren Format zu ermöglichen
Unser Ansatz dazu steht hier: https://productnow.ai/blogs/extracting-html-from-ai-prototyp...
Ich werde mir das jetzt ansehen und prüfen, ob ich Teile davon austauschen kann. Die Idee eines Offline-Mirrors gefällt mir, und Anwendungsfälle rund um Zusammenarbeit werden dadurch viel einfacher
Dort steht
kage serve $HOME/data/kage/paulgraham.com, aber wenn das Ergebnis statisch ist, verstehe ich nicht, warum ein Server nötig ist. Könnte man es nicht einfach direkt im Browser öffnen?Wenn zum Beispiel so etwas wie
$ firefox $HOME/data/kage/paulgraham.commöglich wäre, könnte man das Ergebnis auch auf Rechnern ohne installiertes kage nutzenpython -m http.serververwenden. Ich habe es noch nicht ausprobiert, aber es sollte funktionierenTatsächlich besteht Kage aus zwei Teilen. Einer ist der Crawler, der nach dem Rendern durch Chrome/Chromium das DOM erfasst, die Seiten crawlt und in sauberes HTML umwandelt; der andere ist die Pack/Serve-Komponente, die das Ergebnis als ZIM-Datei für Kiwix oder als ausführbare Datei paketiert
Ich halte SingleFile [0] für eine deutlich robustere Version davon.
Es entfernt auch sämtliches JavaScript, bündelt aber alles in einer einzelnen HTML-Datei, die sich leicht weitergeben lässt. Binäre Assets wie Webfonts oder Bilder werden als base64-Strings eingebettet.
Es bietet auch eine Puppeteer-basierte CLI [1].
[0]: https://github.com/gildas-lormeau/singlefile
[1]: https://github.com/gildas-lormeau/single-file-cli
Was hier umgesetzt wird, ist das Spiegeln einer ganzen Website einschließlich Unterseiten, sodass man sie auch offline vollständig durchsuchen kann. Zum Beispiel alle Essays auf paulgraham.com.
Wenn Kage allerdings die Reproduktionsqualität von SingleFile mit einem HTTPTrack-artigen Spidering-Ansatz verbinden kann, wirkt das vielversprechend. Single-Page-Apps sind etwas knifflig zu archivieren, daher bin ich gespannt, wie gut Kage damit umgehen wird.
File -> Save asin einem beliebigen Webbrowser auf dem Computer?Ich habe versucht, eine HTTP-Seite, also keine HTTPS-Seite, zu klonen, aber bekam
navigation failed: net::ERR_NAME_NOT_RESOLVED. Auch wenn ich das Protokoll explizit alshttp://angegeben habe, war es dasselbe.Wenn ich im Flugzeug etwas aus einem Wiki lesen wollte, habe ich immer httrack(https://www.httrack.com) verwendet, um es herunterzuladen. Perfekt ist es nicht, aber besser als andere Dinge, die ich früher gefunden hatte.
Das hier werde ich auch ausprobieren, und wenn die Ergebnisse gut sind, würde mich das wirklich freuen.
https://wiki.openzim.org/wiki/Build_your_ZIM_file
EDIT: https://get.kiwix.org/en/solutions/applications/kiwix-reader...
Ich habe über Jahre hinweg ziemlich viele Archive alter Websites gesammelt. Interessant ist, dass hässliche HTML-Dumps nützlicher waren als „perfekte“ Archive.
Das ist auch einer der Gründe, warum ich RSS im Lauf der Zeit mehr zu schätzen gelernt habe. Zehn Jahre alte Feeds sind heute oft benutzbarer als sorgfältig konservierte, anwendungsartige Websites.
Ich will es noch etwas aufräumen und dann bald als Open Source veröffentlichen.
Das hier scheint eine ziemlich große Last für eine Website erzeugen zu können. Gibt es Einstellungen, um die Klon-Geschwindigkeit zu drosseln oder Bilder/Videos zu vermeiden?
Ich frage mich auch, ob es eine Möglichkeit gibt, nur Teile einer Website abzurufen.
Sauberes Projekt, und die Idee gefällt mir.
Beim schnellen Durchlesen ist mir aufgefallen, dass Chrome mit
--no-sandboxgestartet wird — gibt es dafür einen besonderen Grund? Aus Sicherheitssicht ist das wahrscheinlich keine gute Idee. Falls es keinen guten Grund gibt, würde ich empfehlen, die Sandbox aktiviert zu lassen.Jedenfalls tolle Arbeit.
--no-sandboxwird in Docker benötigt. Vermutlich wurde einfach angenommen, dass es meistens in Docker ausgeführt wird, oder?