我最近深入研究了網(wǎng)站歸檔,因為有些朋友擔(dān)心遇到糟糕的系統(tǒng)管理或惡意刪除時失去對放在網(wǎng)上的內(nèi)容的控制權(quán)。這使得網(wǎng)站歸檔成為系統(tǒng)管理員工具箱中的重要工具。事實證明,有些網(wǎng)站比其他網(wǎng)站更難歸檔。本文介紹了對傳統(tǒng)網(wǎng)站進(jìn)行歸檔的過程,并闡述在面對最新流行單頁面應(yīng)用程序(SPA)的現(xiàn)代網(wǎng)站時,它有哪些不足。
轉(zhuǎn)換為簡單網(wǎng)站
手動編碼 HTML 網(wǎng)站的日子早已不復(fù)存在?,F(xiàn)在的網(wǎng)站是動態(tài)的,并使用最新的 JavaScript、PHP 或 Python 框架即時構(gòu)建。結(jié)果,這些網(wǎng)站更加脆弱:數(shù)據(jù)庫崩潰、升級出錯或者未修復(fù)的漏洞都可能使數(shù)據(jù)丟失。在我以前是一名 Web 開發(fā)人員時,我不得不接受客戶這樣的想法:希望網(wǎng)站基本上可以永久工作。這種期望與 web 開發(fā)“快速行動和破除陳規(guī)”的理念不相符。在這方面,使用Drupal 內(nèi)容管理系統(tǒng)(CMS)尤其具有挑戰(zhàn)性,因為重大更新會破壞與第三方模塊的兼容性,這意味著客戶很少承擔(dān)的起高昂的升級成本。解決方案是將這些網(wǎng)站歸檔:以實時動態(tài)的網(wǎng)站為基礎(chǔ),將其轉(zhuǎn)換為任何 web 服務(wù)器可以永久服務(wù)的純 HTML 文件。此過程對你自己的動態(tài)網(wǎng)站非常有用,也適用于你想保護(hù)但無法控制的第三方網(wǎng)站。
對于簡單的靜態(tài)網(wǎng)站,古老的 Wget 程序就可以勝任。然而鏡像保存一個完整網(wǎng)站的命令卻是錯綜復(fù)雜的:
$ nice wget --mirror --execute robots=off --no-verbose --convert-links \ --backup-converted --page-requisites --adjust-extension \ --base=./ --directory-prefix=./ --span-hosts \ --domains=xintu.example.com,example.com http://xintu.example.com/以上命令下載了網(wǎng)頁的內(nèi)容,也抓取了指定域名中的所有內(nèi)容。在對你喜歡的網(wǎng)站執(zhí)行此操作之前,請考慮此類抓取可能對網(wǎng)站產(chǎn)生的影響。上面的命令故意忽略了 robots.txt 規(guī)則,就像現(xiàn)在歸檔者的習(xí)慣做法,并以盡可能快的速度歸檔網(wǎng)站。大多數(shù)抓取工具都可以選擇在兩次抓取間暫停并限制帶寬使用,以避免使網(wǎng)站癱瘓。
上面的命令還將獲取 “頁面所需(LCTT 譯注:單頁面所需的所有元素)”,如樣式表(CSS)、圖像和腳本等。下載的頁面內(nèi)容將會被修改,以便鏈接也指向本地副本。任何 web 服務(wù)器均可托管生成的文件集,從而生成原始網(wǎng)站的靜態(tài)副本。
以上所述是事情一切順利的時候。任何使用過計算機的人都知道事情的進(jìn)展很少如計劃那樣;各種各樣的事情可以使程序以有趣的方式脫離正軌。比如,在網(wǎng)站上有一段時間很流行日歷塊。內(nèi)容管理系統(tǒng)會動態(tài)生成這些內(nèi)容,這會使爬蟲程序陷入死循環(huán)以嘗試檢索所有頁面。靈巧的歸檔者可以使用正則表達(dá)式(例如 Wget 有一個 --reject-regex 選項)來忽略有問題的資源。如果可以訪問網(wǎng)站的管理界面,另一個方法是禁用日歷、登錄表單、評論表單和其他動態(tài)區(qū)域。一旦網(wǎng)站變成靜態(tài)的,(那些動態(tài)區(qū)域)也肯定會停止工作,因此從原始網(wǎng)站中移除這些雜亂的東西也不是全無意義。
JavaScript 噩夢
很不幸,有些網(wǎng)站不僅僅是純 HTML 文件構(gòu)建的。比如,在單頁面網(wǎng)站中,web 瀏覽器通過執(zhí)行一個小的 JavaScript 程序來構(gòu)建內(nèi)容。像 Wget 這樣的簡單用戶代理將難以重建這些網(wǎng)站的有意義的靜態(tài)副本,因為它根本不支持 JavaScript。理論上,網(wǎng)站應(yīng)該使用漸進(jìn)增強技術(shù),在不使用 JavaScript 的情況下提供內(nèi)容和實現(xiàn)功能,但這些指引很少被人遵循 —— 使用過 NoScript 或 uMatrix 等插件的人都知道。
傳統(tǒng)的歸檔方法有時會以最愚蠢的方式失敗。在嘗試為一個本地報紙網(wǎng)站(pamplemousse.ca)創(chuàng)建備份時,我發(fā)現(xiàn) WordPress 在包含 的 JavaScript 末尾添加了查詢字符串(例如:?ver=1.12.4)。這會使提供歸檔服務(wù)的 web 服務(wù)器不能正確進(jìn)行內(nèi)容類型檢測,因為其靠文件擴展名來發(fā)送正確的Content-Type頭部信息。在 web 瀏覽器加載此類歸檔時,這些腳本會加載失敗,導(dǎo)致動態(tài)網(wǎng)站受損。
隨著 web 向使用瀏覽器作為執(zhí)行任意代碼的虛擬機轉(zhuǎn)化,依賴于純 HTML 文件解析的歸檔方法也需要隨之適應(yīng)。這個問題的解決方案是在抓取時記錄(以及重現(xiàn))服務(wù)器提供的 HTTP 頭部信息,實際上專業(yè)的歸檔者就使用這種方法。
創(chuàng)建和顯示 WARC 文件
在 互聯(lián)網(wǎng)檔案館Internet Archive 網(wǎng)站,Brewster Kahle 和 Mike Burner 在 1996 年設(shè)計了ARC (即 “ARChive”)文件格式,以提供一種聚合其歸檔工作所產(chǎn)生的百萬個小文件的方法。該格式最終標(biāo)準(zhǔn)化為 WARC(“Web ARChive”)規(guī)范,并在 2009 年作為 ISO 標(biāo)準(zhǔn)發(fā)布,2017 年修訂。標(biāo)準(zhǔn)化工作由國際互聯(lián)網(wǎng)保護(hù)聯(lián)盟International Internet Preservation Consortium(IIPC)領(lǐng)導(dǎo),據(jù)維基百科稱,這是一個“為了協(xié)調(diào)為未來而保護(hù)互聯(lián)網(wǎng)內(nèi)容的努力而成立的國際圖書館組織和其他組織”;它的成員包括美國國會圖書館US Library of Congress和互聯(lián)網(wǎng)檔案館等。后者在其基于 Java 的 Heritrix crawler(LCTT 譯注:一種爬蟲程序)內(nèi)部使用了 WARC 格式。
WARC 在單個壓縮文件中聚合了多種資源,像 HTTP 頭部信息、文件內(nèi)容,以及其他元數(shù)據(jù)。方便的是,Wget 實際上提供了 --warc 參數(shù)來支持 WARC 格式。不幸的是,web 瀏覽器不能直接顯示 WARC 文件,所以為了訪問歸檔文件,一個查看器或某些格式轉(zhuǎn)換是很有必要的。我所發(fā)現(xiàn)的最簡單的查看器是 pywb,它以 Python 包的形式運行一個簡單的 web 服務(wù)器提供一個像“時光倒流機網(wǎng)站W(wǎng)ayback Machine”的界面,來瀏覽 WARC 文件的內(nèi)容。執(zhí)行以下命令將會在 http://localhost:8080/ 地址顯示 WARC 文件的內(nèi)容:
$ pip install pywb$ wb-manager init example$ wb-manager add example crawl.warc.gz$ wayback順便說一句,這個工具是由 Webrecorder 服務(wù)提供者建立的,Webrecoder 服務(wù)可以使用 web 瀏覽器保存動態(tài)頁面的內(nèi)容。
很不幸,pywb 無法加載 Wget 生成的 WARC 文件,因為它遵循的 1.0 規(guī)范不一致,1.1 規(guī)范修復(fù)了此問題。就算 Wget 或 pywb 修復(fù)了這些問題,Wget 生成的 WARC 文件對我的使用來說不夠可靠,所以我找了其他的替代品。引起我注意的爬蟲程序簡稱 crawl。以下是它的調(diào)用方式:
$ crawl https://example.com/(它的 README 文件說“非常簡單”。)該程序支持一些命令行參數(shù)選項,但大多數(shù)默認(rèn)值都是最佳的:它會從其他域獲取頁面所需(除非使用 -exclude-related 參數(shù)),但肯定不會遞歸出域。默認(rèn)情況下,它會與遠(yuǎn)程站點建立十個并發(fā)連接,這個值可以使用 -c 參數(shù)更改。但是,最重要的是,生成的 WARC 文件可以使用 pywb 完美加載。
未來的工作和替代方案
這里還有更多有關(guān)使用 WARC 文件的資源。特別要提的是,這里有一個專門用來歸檔網(wǎng)站的 Wget 的直接替代品,叫做 Wpull。它實驗性地支持了 PhantomJS 和 youtube-dl 的集成,即允許分別下載更復(fù)雜的 JavaScript 頁面以及流媒體。該程序是一個叫做 ArchiveBot 的復(fù)雜歸檔工具的基礎(chǔ),ArchiveBot 被那些在 ArchiveTeam 的“零散離群的歸檔者、程序員、作家以及演說家”使用,他們致力于“在歷史永遠(yuǎn)丟失之前保存它們”。集成 PhantomJS 好像并沒有如團隊期望的那樣良好工作,所以 ArchiveTeam 也用其它零散的工具來鏡像保存更復(fù)雜的網(wǎng)站。例如,snscrape 將抓取一個社交媒體配置文件以生成要發(fā)送到 ArchiveBot 的頁面列表。該團隊使用的另一個工具是 crocoite,它使用無頭模式的 Chrome 瀏覽器來歸檔 JavaScript 較多的網(wǎng)站。
如果沒有提到稱做“網(wǎng)站復(fù)制者”的 HTTrack 項目,那么這篇文章算不上完整。它工作方式和 Wget 相似,HTTrack 可以對遠(yuǎn)程站點創(chuàng)建一個本地的副本,但是不幸的是它不支持輸出 WRAC 文件。對于不熟悉命令行的小白用戶來說,它在人機交互方面顯得更有價值。
同樣,在我的研究中,我發(fā)現(xiàn)了叫做 Wget2 的 Wget 的完全重制版本,它支持多線程操作,這可能使它比前身更快。和 Wget 相比,它舍棄了一些功能,但是最值得注意的是拒絕模式、WARC 輸出以及 FTP 支持,并增加了 RSS、DNS 緩存以及改進(jìn)的 TLS 支持。
最后,我個人對這些工具的愿景是將它們與我現(xiàn)有的書簽系統(tǒng)集成起來。目前我在 Wallabag 中保留了一些有趣的鏈接,這是一種自托管式的“稍后閱讀”服務(wù),意在成為 Pocket(現(xiàn)在由 Mozilla 擁有)的免費替代品。但是 Wallabag 在設(shè)計上只保留了文章的“可讀”副本,而不是一個完整的拷貝。在某些情況下,“可讀版本”實際上不可讀,并且 Wallabag 有時無法解析文章。恰恰相反,像 bookmark-archiver 或 reminiscence 這樣其他的工具會保存頁面的屏幕截圖以及完整的 HTML 文件,但遺憾的是,它沒有 WRAC 文件所以沒有辦法更可信的重現(xiàn)網(wǎng)頁內(nèi)容。
我所經(jīng)歷的有關(guān)鏡像保存和歸檔的悲劇就是死數(shù)據(jù)。幸運的是,業(yè)余的歸檔者可以利用工具將有趣的內(nèi)容保存到網(wǎng)上。對于那些不想麻煩的人來說,“互聯(lián)網(wǎng)檔案館”看起來仍然在那里,并且 ArchiveTeam 顯然正在為互聯(lián)網(wǎng)檔案館本身做備份。
掃描二維碼推送至手機訪問。
版權(quán)聲明:本文由信途科技轉(zhuǎn)載于網(wǎng)絡(luò),如有侵權(quán)聯(lián)系站長刪除。
轉(zhuǎn)載請注明出處http://macbookprostickers.com/xintu/13948.html