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