1

我经常使用 wget 来镜像非常大的网站。包含热链接内容(无论是图像、视频、css、js)的站点会造成问题,因为我似乎无法指定我希望 wget 抓取其他主机上的页面必需品,而无需抓取也遵循指向其他主机的超链接主机。

比如我们看这个页面 https://dl.dropbox.com/u/11471672/wget-all-the-things.html

让我们假设这是一个我想完全镜像的大型站点,包括所有页面要求——包括那些热链接的。

wget -e robots=off -r -l inf -pk 

^^ 获取除热链接图像之外的所有内容

wget -e robots=off -r -l inf -pk -H

^^ 获取所有内容,包括热链接图像,但失控,继续下载整个网络

wget -e robots=off -r -l inf -pk -H --ignore-tags=a

^^ 获取第一页,包括热链接和本地图像,不跟随超链接到范围之外的站点,但显然也不跟随超链接到站点的下一页。

我知道还有其他各种工具和方法可以实现这一点(HTTrack 和 Heritrix 允许用户区分其他主机上的热链接内容和指向其他主机的超链接),但我想看看 wget 是否可行. 理想情况下,这不会在后处理中完成,因为我希望将外部内容、请求和标头包含在我输出的 WARC 文件中。

4

2 回答 2

3

您不能只为 page-reqs 指定跨越主机;-H 是全有或全无。由于 -r 和 -H 将拉下整个 Internet,因此您需要拆分使用它们的爬网。要获取热链接的页面请求,您必须运行 wget 两次:一次递归通过站点的结构,一次获取热链接的请求。我对这种方法很幸运:

1)wget -r -l inf [other non-H non-p switches] http://www.example.com

2) 在站点结构 ( ) 中构建所有 HTML 文件的列表find . | grep html并通过管道传输到文件

3)wget -pH [other non-r switches] -i [infile]

第 1 步在您的本地计算机上构建站点的结构,并为您提供其中的任何 HTML 页面。第 2 步为您提供页面列表,第 3 步获取这些页面上使用的所有资产。这将在您的本地计算机上构建一个完整的镜像,只要热链接资产仍然存在。

于 2012-10-19T16:58:32.637 回答
0

我已经设法通过使用正则表达式来做到这一点。像这样的东西要镜像http://www.example.com/docs

wget --mirror --convert-links --adjust-extension \
--page-requisites --span-hosts \
--accept-regex '^http://www\.example\.com/docs|\.(js|css|png|jpeg|jpg|svg)$' \
http://www.example.com/docs

您可能必须调整每个特定站点的正则表达式。例如,某些站点喜欢在 css 文件(例如style.css?key=value)上使用参数,本示例将排除这些参数。

您要从其他主机包含的文件可能至少包含

  • 图片:png jpg jpeg gif
  • 字体:ttf otf woff woff2 eot
  • 其他:js css svg

有人认识其他人吗?

因此,您想要的实际正则表达式可能看起来更像这样(作为一个没有换行符的字符串):

^http://www\.example\.org/docs|\.([Jj][Ss]|[Cc][Ss][Ss]|[Pp][Nn][Gg]|[Jj]
[Pp][Ee]?[Gg]|[Ss][Vv][Gg]|[Gg][Ii][Ff]|[Tt][Tt][Ff]|[Oo][Tt][Ff]|[Ww]
[Oo][Ff][Ff]2?|[Ee][Oo][Tt])(\?.*)?$
于 2015-03-25T11:00:54.800 回答