递归wget与热链接的必需品

时间:2012-10-17 12:40:16

标签: wget

我经常使用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文件中。

2 个答案:

答案 0 :(得分:3)

您不能仅为页面请求指定跨越主机; -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步表明了这些页面上使用的所有资产。只要热链接资产仍处于活动状态,这将在本地计算机上构建完整的镜像。

答案 1 :(得分: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])(\?.*)?$