使用 wget 或 httrack 镜像存档网站时遇到问题

use*_*322 17 linux wget httrack webarchive

我正在尝试使用 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,
Run Code Online (Sandbox Code Playgroud)

但我没有属于这个数据库的所有文件,例如

web.archive.org/web/20110808041151/http://cst-www.nrl.navy.mil/lattice/struk/d0c.html.
Run Code Online (Sandbox Code Playgroud)

也许 httrack 会做得更好,但现在这太过分了。

那么,通过什么方式可以从Internet Archive Wayback Machine获取存档网站的本地副本

Cec*_*rry 24

虽然有用,但先前的回答无法简洁、可靠和可重复地解决潜在问题。在这篇文章中,我们简要地详细说明了每个问题的困难,然后提供了一个httrack基于适度的解决方案。

背景

然而,在我们开始之前,请考虑仔细阅读mpy写得很好的回复。在他[is|er] 可悲地被忽视的帖子中,mpy严格地记录了 Wayback Machine 晦涩难懂(老实说很模糊)的档案计划。

不出所料,它并不漂亮。Wayback Machine 不是将站点理智地归档到单个目录中,而是将单个站点短暂地分布在两个或多个数字标识的同级目录中。说这使镜像复杂化将是一种轻描淡写的说法。

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

先前的解决方案1:wget

相关的 StackOverflow 问题“Recover old website off waybackmachine”可能是这方面最糟糕的问题,推荐wget使用 Wayback 镜像。自然,该建议从根本上是不合理的。

在没有复杂的外部 URL 重写(例如,Privoxy)的情况下,wget不能用于可靠地镜像 Wayback 归档的站点。作为“问题 2 + 解决方案”下的mpy详细信息,您选择的任何镜像工具都必须允许您非传递地下载属于目标站点的 URL。默认情况下,大多数镜像工具会以传递方式下载属于目标站点和从该站点链接的站点的所有URL——在最坏的情况下,这意味着“整个 Internet”。

一个具体的例子是有序的。镜像示例域时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:剪贴簿

Prinz推荐ScrapBook,一个 Firefox 插件。一个火狐插件。

这可能就是您需要知道的全部内容。虽然ScrapBookFilter by String...功能确实解决了前面提到的“问题 2 + 解决方案”,但它没有解决后续的“问题 3 + 解决方案”——即无关重复的问题。

ScrapBook甚至是否充分解决了前一个问题也值得怀疑。正如mpy承认的那样:

尽管到目前为止剪贴簿未能完全抓住该网站......

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

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

然后,mpy提供了一个利用wget和的强大解决方案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
Run Code Online (Sandbox Code Playgroud)

完成后,当前目录应为从该 URL 镜像的每种文件类型包含一个子目录。这通常至少包括:

  • css,包含所有镜像的 CSS 样式表。
  • html,包含所有镜像的 HTML 页面。
  • js,包含所有镜像的 JavaScript。
  • ico,包含一个镜像图标。

由于httrack内部重写了所有下载的内容以反映此结构,因此您的站点现在应该无需修改即可浏览。如果您过早地停止了上述命令并想继续下载,请将--continue选项附加到完全相同的命令并重试。

就是这样。不需要外部扭曲、容易出错的 URL 重写或基于规则的代理服务器。

享受吧,超级用户。


mpy*_*mpy 9

不幸的是,没有一个答案能够解决从存档网站制作完整镜像的问题(无需将每个文件复制几十次)。所以我想出了另一种方法。Hacked是一个重要的词,因为我的解决方案既不是通用的解决方案,也不是一个非常简单的(阅读:复制和粘贴)解决方案。我使用Privoxy 代理服务器在使用 wget 进行镜像时即时重写文件。

但首先,从Wayback Machine镜像有什么困难?

问题 1 + 解决方案

Wayback 工具栏便于交互式使用,但可能会干扰 wget。所以用隐私过滤规则摆脱它

FILTER: removewaybacktoolbar remove Wayback toolbar
s|BEGIN WAYBACK TOOLBAR INSERT.*END WAYBACK TOOLBAR INSERT|Wayback Toolbar removed|s
Run Code Online (Sandbox Code Playgroud)

问题 2 + 解决方案

我想捕获整个站点,因此需要一个不太小的递归深度。但我不希望 wget 抓取整个服务器。通常你会使用wget的no-parent选项-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 机器模拟行为:

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
Run Code Online (Sandbox Code Playgroud)

我将把它作为一个练习来深入研究语法。什么此过滤器是这样的:它代替所有韦巴克网址喜欢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
Run Code Online (Sandbox Code Playgroud)

实际上,包含在中的每个 14 位数字/.../都会被替换为20120713212803(将其调整为所需站点的最新快照)。如果站点结构中存在并非源自 Wayback 机器的此类数字,则这可能是一个问题。不完美,但对于Strukturtypen站点来说很好。

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

使用 wget 镜像归档站点

所以,最后user.filteruser.actionvia中启用这些 privoxy 过滤器(在 中定义)

{ +filter{removewaybacktoolbar} +filter{blocknonparentpages} +filter{rewritewaybackstamp} }
web.archive.org
Run Code Online (Sandbox Code Playgroud)

你可以像往常一样使用 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
Run Code Online (Sandbox Code Playgroud)

我使用了这些选项,但也-m应该有效。你最终会得到文件夹

20120713212803
20120713212803cs_
20120713212803im_
20120713212803js_
Run Code Online (Sandbox Code Playgroud)

由于 Wayback 机器分离图像 ( im_)、样式表 ( cs_) 等。我将所有内容合并在一起,并使用了一些 sed 魔法来相应地替换丑陋的相关链接 ( ../../../../20120713212803js_/http:/cst-www.nrl.navy.mil/lattice)。但这并不是真正必要的。


小智 5

获取

--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 扩展,它可以帮助您保存网页和轻松管理收藏。主要特点是轻便、速度、准确性和多语言支持。主要功能有:
* 保存网页 * 保存网页
片段
* 保存网站
* 以与书签相同的方式组织收藏
* 全文搜索和快速过滤搜索收藏
* 编辑收集的网页
* 文本/HTML类似于 Opera 笔记的编辑功能

如何镜像站点
安装剪贴簿 并重新启动 Firefox

  1. 在浏览器中加载页面[要镜像的网页]
  2. 右键单击页面 -> 将页面另存为...
  3. 深度保存中选择级别 并按保存 在此处输入图片说明
  4. 选择Restrict to Drirectory/Domain过滤器
    在此处输入图片说明

等待它镜像完成。镜像后,您可以从ScrapBook菜单中离线访问该网站。


Mic*_*oto 0

请小心以下命令,因为它会占用很多资源。“l”后面的 1 告诉它抓取网站上 1 级深度的链接的所有页面。如果你想让它爬得更深,请将其更改为 2,但它可能永远不会结束,因为它可能会陷入循环。

wget -rHpkl 1 -e robots=off http://www.example.com/
Run Code Online (Sandbox Code Playgroud)

我不确定您想要保留网站的哪些部分以及您不关心哪些部分,但您可能应该将网站的不同部分列入白名单和/或黑名单,以仅获得您想要的内容并防止自己下载 archive.org 或互联网的全部内容。

用于-D www.examle.com,www.another.example.com仅将您想要的域列入白名单,或用于--exclude-domains www.examle.com,www.another.example.com 将您不需要的域列入黑名单。