我经常使用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文件中。
答案 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])(\?.*)?$