背景

背景

我正在尝试使用 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 会做得更好,但是现在它太过分了。

那么,通过什么方式可以从互联网档案馆 Wayback Machine?

答案1

虽然之前的反应很有帮助,但未能简明、可靠且可重复地解决根本问题。在这篇文章中,我们简要详述了每个问题的难点,然后提供了一个适度的httrack解决方案。

背景

不过,在我们开始之前,请考虑阅读写得很好的回复。在他那篇被忽视的帖子中,严格记录 Wayback Machine 模糊的(并且说实话是令人困惑的)存档方案。

毫不奇怪,它并不漂亮。Wayback Machine 不会将网站理所当然地归档到单个目录中,而是会将单个网站暂时分散到两个或多个以数字标识的同级目录中。说这会使镜像变得复杂,其实是相当轻描淡写。

理解该方案所带来的可怕陷阱是理解先前解决方案不足之处的核心。让我们继续吧,好吗?

先前的解决方案 1:wget

相关的 StackOverflow 问题“从 waybackmachine 恢复旧网站”在这方面可能是最糟糕的,建议wget使用 Wayback 镜像。当然,这个建议从根本上来说不合理。

在没有复杂的外部 URL 重写的情况下(例如Privoxy),wget不能用于可靠地镜像 Wayback 存档站点。作为请参阅“问题 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,通常会导致网站存档时包含全部或大部分互联网存档内容,尤其是嵌入外部托管资产(例如 YouTube 视频)的网站。

那太糟糕了。尽管wget 提供一个命令行--exclude-directories选项,接受一个或多个与要排除的 URL 匹配的模式,这些模式包括不是通用正则表达式;它们是简单的匹配,其*语法匹配零个或多个字符排除/。由于要排除的 URL 包含任意多个/字符,wget 不能可用于排除这些 URL,因此不能用于镜像 Wayback 存档站点。时期。不幸的故事结束了。

这个问题已经公共记录自 2009 年以来就一直存在此问题。但该问题至今仍未得到解决。下一个!

先前的解决方案 2:剪贴簿

普林茨推荐ScrapBook一个 Firefox 插件。Firefox 插件。

这可能就是你需要知道的全部内容。虽然ScrapBookFilter by String...功能解决上述“问题 2 + 解决方案”,它确实不是解决后续的“问题 3 + 解决方案”——即无关重复的问题。

ScrapBook是否能充分解决前一个问题也值得怀疑。承认:

尽管 Scrapbook 到目前为止还未能完全占领该网站……

不可靠和过于简单的解决方案不是解决方案。下一步!

先前的解决方案 3:wget + Privoxy

然后提供一个强大的解决方案,同时利用wgetPrivoxy。虽然wget 配置起来相当简单,Privoxy但一点也不合理。或者简单。

由于正确安装、配置和使用存在难以估量的技术障碍Privoxy,我们尚未确认的解决方案。它应该以可扩展、稳健的方式工作。考虑到进入门槛,此解决方案可能更适合大规模自动化,而不是普通网站管理员试图恢复中小型网站。

wget+Privoxy值得一看吗?绝对地。但大多数超级用户可能需要更简单、更容易应用的解决方案才能获得更好的服务。

新解决方案:httrack

输入httrack,这是一个命令行实用程序,实现了wget镜像功能的超集。httrack支持基于模式的 URL 排除简单的网站重组。前者解决了的“问题 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 抓取整个服务器。通常你使用无父母wget选项-np可用于此目的。但这在这里不起作用,因为您想要获取

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 machine 模拟该行为:

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 machine 非常智能,这很有帮助。您可以请求文件

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 machine 的数字,则这可能是一个问题。虽然不完美,但对于结构类型地点。

这样做的好处是,wget 会忽略重定向到的新位置并将文件(在上面的例子中)保存为web.archive.org/web/20110801041529/http://cst-www.nrl.navy.mil/lattice/struk/a_f.html

使用 wget 镜像存档站点

因此,最后通过以下方式user.filter启用这些 privoxy 过滤器(在 中定义)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 machine 会将图片 ( im_)、样式表 ( cs_) 等分开。我将所有内容合并在一起,并使用一些 sed magic 相应地替换了丑陋的相对链接 ( ../../../../20120713212803js_/http:/cst-www.nrl.navy.mil/lattice)。但这并不是必需的。

答案3

获得

--page-requisites
此选项使 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 的一个扩展,可帮助您保存网页并轻松管理收藏。主要特点是轻便、快速、准确和支持多种语言。主要功能包括:
* 保存网页
* 保存网页片段
* 保存网站
* 以与书签相同的方式组织收藏
* 收藏的全文搜索和快速过滤搜索
* 编辑收藏的网页
* 类似于 Opera 的 Notes 的文本/HTML 编辑功能

如何镜像网站
安装剪贴簿 然后重新启动 Firefox

  1. 在浏览器中加载页面[要镜像的网页]
  2. 右键单击页面->将页面另存为...
  3. 选择级别深入保存 然后按保存 在此处输入图片描述
  4. 选择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/

相关内容