我正在嘗試使用 wget 建立網站的本地鏡像。但我發現我沒有獲得所有連結頁面。
這是網站
http://web.archive.org/web/20110722080716/http://cst-www.nrl.navy.mil/lattice/
我不想要所有以 開頭的頁面web.archive.org
,但我確實想要所有以 開頭的頁面http://web.archive.org/web/20110722080716/http://cst-www.nrl.navy.mil/lattice/
。
當我使用wget -r
, 在我的文件結構中我發現
web.archive.org/web/20110722080716/http://cst-www.nrl.navy.mil/lattice/index.html,
但我沒有屬於該資料庫的所有文件,例如
web.archive.org/web/20110808041151/http://cst-www.nrl.navy.mil/lattice/struk/d0c.html.
也許 httrack 會做得更好,但現在它的吸引力太大了。
那麼,透過什麼方式可以從存檔網站取得本地副本?互聯網檔案回溯機?
答案1
先前的回答雖然有幫助,但未能簡潔、可靠且可重複地解決根本問題。在這篇文章中,我們簡要地詳細介紹了每個問題的困難,然後提供一個適度的httrack
解決方案。
背景
然而,在我們開始之前,請考慮仔細閱讀mpy的回覆寫得很好。在他[is|er]令人遺憾地被忽視的貼文中,mpy嚴格記錄了 Wayback Machine 晦澀(而且確實令人困惑)的檔案方案。
毫不奇怪,它並不漂亮。The Wayback Machine 並不是將網站完整地歸檔到單一目錄中,而是將單一網站暫時分佈在兩個或多個以數位方式識別的同級目錄中。說這使得鏡像變得複雜是一種輕描淡寫的說法。
了解方案所帶來的可怕陷阱是了解先前解決方案的不足之處的核心。我們繼續吧,好嗎?
先前的解決方案1:wget
相關的 StackOverflow 問題“從 waybackmachine 恢復舊網站”在這方面可能是最嚴重的罪犯,建議wget
使用 Wayback 鏡像。當然,這個建議從根本上來說是不合理的。
在沒有複雜的外部 URL 重寫的情況下(例如,Privoxy
),wget
不能用於可靠地鏡像 Wayback 存檔網站。作為mpy詳細資訊請參閱“問題 2 + 解決方案”,您選擇的任何鏡像工具都必須允許您非傳遞下載僅有的屬於目標網站的 URL。預設情況下,大多數鏡像工具都會下載全部屬於目標網站和從該網站連結的網站的 URL – 在最壞的情況下,這意味著「整個互聯網」。
下面是一個具體的例子。當鏡像範例網域時kearescue.com
,您的鏡像工具必須:
- 包括所有符合的 URL
https://web.archive.org/web/*/http://kearescue.com
。這些是目標站點提供的資產(例如https://web.archive.org/web/20140521010450js_/http_/kearescue.com/media/system/js/core.js
)。 - 排除所有其他 URL。這些是僅從目標網站連結到的其他網站提供的資產(例如,
https://web.archive.org/web/20140517180436js_/https_/connect.facebook.net/en_US/all.js
)。
如果未能排除此類 URL,通常會提取網站存檔時存檔的全部或大部分 Internet,特別是對於嵌入外部託管資產(例如 YouTube 影片)的網站。
那會很糟糕。儘管wget
做提供一個命令列--exclude-directories
選項,接受一個或多個與要排除的 URL 相符的模式,這些是不是通用正規表示式;它們是簡單的 glob,其*
語法匹配零個或多個字符排除/
。由於要排除的 URL 包含任意多個/
字符,wget
不能用於排除這些 URL,因此不能用於鏡像 Wayback 存檔網站。時期。不幸的故事結束了。
這個問題已經上了公共記錄至少從 2009 年開始,這個問題還沒有解決。下一個!
先前的解決方案 2:剪貼簿
普林茲推薦ScrapBook
一個 Firefox 外掛。一個火狐瀏覽器插件。
這可能就是您需要知道的全部內容。 WhileScrapBook
的Filter by String...
功能做解決了前面提到的“問題 2 + 解決方案”,它確實不是解決後續的「問題3+解決方案」—即無關重複的問題。
ScrapBook
是否能充分解決前一個問題還值得懷疑。作為mpy承認:
儘管Scrapbook到目前為止未能完全佔領該網站......
不可靠和過於簡單的解決方案都不是解決方案。下一個!
先前的解決方案 3:wget + Privoxy
mpywget
然後提供一個利用和 的強大解決方案Privoxy
。儘管wget
是配置相當簡單,Privoxy
但絕對不合理。或簡單。
由於正確安裝、配置和使用存在不可估量的技術障礙Privoxy
,我們尚未確認mpy的解決方案。它應該以可擴展、穩健的方式工作。考慮到進入壁壘,該解決方案可能比嘗試恢復中小型網站的普通網站管理員更適合大規模自動化。
wget
+Privoxy
值得一看嗎?絕對地。但大多數超級用戶可能會透過更簡單、更容易應用的解決方案得到更好的服務。
新解決方案:httrack
Enter httrack
,一個命令列實用程序,實現wget
的鏡像功能的超集。httrack
支援基於模式的 URL 排除和簡單的網站重組。前者解決mpy的《問題2+解決方案》;後者是“問題3+解決方案”。
在下面的抽象範例中,替換:
${wayback_url}
透過歸檔整個目標網站的頂級目錄的 URL(例如,'https://web.archive.org/web/20140517175612/http://kearescue.com'
)。${domain_name}
${wayback_url}
透過排除前綴http://
(例如, )中存在的相同網域名稱'kearescue.com'
。
開始了。安裝httrack
,打開終端機窗口,cd
轉到您希望將網站下載到的本機目錄,然後執行以下命令:
httrack\
${wayback_url}\
'-*'\
'+*/${domain_name}/*'\
-N1005\
--advanced-progressinfo\
--can-go-up-and-down\
--display\
--keep-alive\
--mirror\
--robots=0\
--user-agent='Mozilla/5.0 (X11;U; Linux i686; en-GB; rv:1.9.1) Gecko/20090624 Ubuntu/9.04 (jaunty) Firefox/3.5'\
--verbose
完成後,目前目錄應包含從該 URL 映像的每種檔案類型的子目錄。這通常至少包括:
css
,包含所有鏡像 CSS 樣式表。html
,包含所有鏡像的 HTML 頁面。js
,包含所有鏡像 JavaScript。ico
,包含一個鏡像圖示。
由於httrack
在內部重寫了所有下載的內容以反映此結構,因此您的網站現在應該可以按原樣瀏覽,無需修改。如果您過早停止上述命令並希望繼續下載,請將該--continue
選項附加到完全相同的命令並重試。
就是這樣。無需外部扭曲、容易出錯的 URL 重寫或基於規則的代理伺服器。
享受吧,超級用戶朋友們。
答案2
不幸的是,沒有一個答案能夠解決從存檔網站製作完整鏡像的問題(無需將每個檔案複製數十次)。所以我組合了另一種方法。被駭是重要的詞,因為我的解決方案既不是通用解決方案,也不是非常簡單的解決方案(閱讀:複製和貼上)。我用的是Privoxy代理伺服器重寫文件即時使用 wget 進行鏡像時。
但首先,從回溯機?
問題1+解決方案
Wayback 工具列對於互動式使用很方便,但可能會幹擾 wget。所以用 privoxy 過濾規則擺脫它
FILTER: removewaybacktoolbar remove Wayback toolbar
s|BEGIN WAYBACK TOOLBAR INSERT.*END WAYBACK TOOLBAR INSERT|Wayback Toolbar removed|s
問題2+解決方案
我想捕獲整個站點,因此需要一個不太小的遞歸深度。但我不希望 wget 抓取整個伺服器。通常你使用無父母-np
用於此目的的 wget選項。但這在這裡行不通,因為你想要得到
http://web.archive.org/web/20110722080716/http://cst-www.nrl.navy.mil/lattice/struk/hcp.html
但是也
http://web.archive.org/web/20110801041529/http://cst-www.nrl.navy.mil/lattice/struk/a_f.html
(注意路徑中更改的時間戳記)。省略-np
將導致 wget 爬行到(...)http://cst-www.nrl.navy.mil
,並最終檢索整個navi.mil
網站。我絕對不想這樣!所以這個過濾器嘗試-np
用 Wayback 機器模擬行為:
FILTER: blocknonparentpages emulate wget -np option
s|/web/([0-9].*)/http://cst-www.nrl.navy.mil/lattice/|THIS_IS_A_GOOD_$1_ADDRESS|gU
s|/web/(.*)/http(.*)([" ])|http://some.local.server/404$3|gU
s|THIS_IS_A_GOOD_(.*)_ADDRESS|/web/$1/http://cst-www.nrl.navy.mil/lattice/|gU
我將把它作為深入語法的練習。此過濾器的作用如下: 它會取代所有 Wayback URL,例如http://web.archive.org/web/20110801041529/http://www.nrl.navy.mil/
和http://some.local.server/404
只要它們這樣做不是包含http://cst-www.nrl.navy.mil/lattice/
。
你必須調整http://some.local.server/404
。這是向wget發送404錯誤。也許 privoxy 可以做得更優雅。然而,對我來說最簡單的方法就是重寫本地 http 伺服器上不存在頁面的鏈接,所以我堅持這樣做。
並且,你還需要調整兩種情況都出現來http://cst-www.nrl.navy.mil/lattice/
反映您想要鏡像的網站。
問題3+解決方案
最後,頁面的某些存檔版本可能會連結到另一個快照中的頁面。這又是另一件事。依此類推...您最終會得到同一頁面的大量快照 - 並且 wget 在獲取之前永遠無法完成全部快照。我真的不想那樣,也不想! Wayback 機器非常智能,這對我們很有幫助。您可以索取文件
http://web.archive.org/web/20110801041529/http://cst-www.nrl.navy.mil/lattice/struk/a_f.html
即使它不包含在20110801041529
快照中。它自動地將您重新導向到正確的位置:
http://web.archive.org/web/20110731225728/http://cst-www.nrl.navy.mil/lattice/struk/a_f.html
因此,另一個 privoxy 過濾器將所有快照重寫為最新快照
FILTER: rewritewaybackstamp rewrite Wayback snapshot date
s|/([0-9]{14})(.{0,3})/|/20120713212803$2/|g
實際上,其中包含的每個 14 位數字/.../
都會被替換為20120713212803
(將其調整為所需網站的最新快照)。如果網站結構中存在並非源自 Wayback 計算機的此類數字,這可能會成為問題。不完美,但適合結構類型地點。
這樣做的好處是,wget 忽略它重定向到的新位置並將文件(在上面的示例中)保存為web.archive.org/web/20110801041529/http://cst-www.nrl.navy.mil/lattice/struk/a_f.html
.
使用 wget 鏡像存檔站點
因此,最終在via中啟用了這些 privoxy 過濾器(在 中定義user.filter
)user.action
{ +filter{removewaybacktoolbar} +filter{blocknonparentpages} +filter{rewritewaybackstamp} }
web.archive.org
你可以像往常一樣使用 wget 。不要忘記告訴 wget 使用代理:
export http_proxy="localhost:8118"
wget -r -p -k -e robots=off http://web.archive.org/web/20120713212803/http://cst-www.nrl.navy.mil/lattice/index.html
我使用了這些選項,但-m
也應該有效。你最終會得到資料夾
20120713212803
20120713212803cs_
20120713212803im_
20120713212803js_
因為 Wayback 機器分離圖像 ( im_
)、樣式表 ( )cs_
等。../../../../20120713212803js_/http:/cst-www.nrl.navy.mil/lattice
但這並不是真正必要的。
答案3
獲取
--page-requires
此選項可讓 Wget 下載正確顯示給定 HTML 頁面所需的所有檔案。這包括內聯圖像、聲音和引用的樣式表等內容。
通常,當下載單一 HTML 頁面時,不會下載正確顯示該頁面所需的任何必要文件。將 -r 與 -l 一起使用會有所幫助,但由於 Wget 通常不區分外部文檔和內聯文檔,因此通常會留下缺少必需項目的「葉文檔」。
例如,假設文件 1.html 包含引用 1.gif 的「」標記和指向外部文件 2.html 的「」標記。假設 2.html 類似,但其圖像是 2.gif 並且連結到 3.html。假設這種情況持續到某個任意高的數字。
-m
--mirror
開啟適合鏡像的選項。此選項開啟遞歸和時間戳記、設定無限遞歸深度並保留 FTP 目錄清單。目前它相當於 -r -N -l inf --no-remove-listing。
請注意,Wget 的行為就像已指定 -r 一樣,但只會下載該單一頁面及其必要內容。從該頁面到外部文件的連結將不會被追蹤。實際上,要下載單一頁面及其所有必要項目(即使它們存在於不同的網站上),並確保該批次在本地正確顯示,除了 -p 之外,作者還喜歡使用一些選項:
wget -E -H -k -K -p http://<site>/<document>
SOwget -E -H -k -K -p http://web.archive.org/web/20110722080716/http://cst-www.nrl.navy.mil/lattice
將是最適合您的。但我推薦另一個工具,一個firefox
擴展scrapbook
剪貼簿
ScrapBook 是一個 Firefox 擴展,它可以幫助您保存網頁並輕鬆管理集合。主要特點是輕巧、速度、準確性和多語言支援。主要功能有:
* 儲存網頁
* 儲存網頁片段
* 儲存網站
* 以與書籤相同的方式組織收藏
* 收藏的全文搜尋和快速過濾搜尋
* 編輯收藏的網頁
* 文字/HTML類似於 Opera 筆記的編輯功能
如何鏡像站點
安裝剪貼簿 並重新啟動火狐瀏覽器
- 在瀏覽器中載入頁面[要鏡像的網頁]
- 右鍵單擊頁面 -> 將頁面另存為...
- 從以下位置選擇級別深入保存 然後按儲存
- 選擇
Restrict to Drirectory
/Domain
從篩選
等待鏡像完成。鏡像後,您可以從選單離線存取網站ScrapBook
。
答案4
互聯網檔案館的 URL 格式包括網站存檔的日期和時間。為了節省空間,未更改的資產將連結回網站的先前版本。
例如在這個網址中http://web.archive.org/web/20000229123340/http://www.yahoo.com/網站被抓取的日期是 2000 年 2 月 29 日 12:33 40 秒。
因此,要讓所有人都http://web.archive.org/web/20110722080716/http://cst-www.nrl.navy.mil/lattice/
需要從這裡開始,也要從 中取得所有連結的資產http://web.archive.org/web/*/http://cst-www.nrl.navy.mil/lattice/
。