镜像网站并保持URL结构

5

目标

我想镜像一个网站,这样我就可以在任何地方(本地主机、S3等)托管静态文件,而URL将会与原始网站一样对于最终用户可见。

命令

这对我的需求来说几乎完美(......但不完全):

wget --mirror -nH -np -p -k -E -e robots=off http://mysite

这个命令的作用

  • --mirror:递归下载整个站点
  • -p:下载所有必要的页面资源
  • -k:将URL转换为相对路径,以便可以在任何地方进行托管

这个命令不能做到的事情

  • 防止重复下载
  • 保持(完全)相同的URL结构

问题

有些东西被下载了多次,导致出现myfile.htmlmyfile.1.html。这本来不是什么问题,但是当wget重写超链接时,它会使用myfile.1.html版本编写它,这会改变URL,因此需要考虑SEO(Google会索引难看的URL)。

-nc选项可以解决这个问题,但是在wget-v1.13中,我无法同时使用-k-nc。有关此问题的详细信息,请单击此处

求助?!

我希望使用wget,但现在正在考虑使用另一种工具,如httrack,但我还没有使用过它。

如果您有任何关于如何实现此目标(使用wget、httrack或其他任何工具)的想法,将不胜感激!


只需通过FTP登录并下载它。 - DavidB
很抱歉,这是不可能的,因为该网站是动态生成的。我想要导出一个静态版本的这个动态网站。 - Steve Occhipinti
哦,我明白了,对于脑抽我道歉。 - DavidB
你是如何获取两个 myfile.html 文件的?它们是否位于不同的路径下,但 wget 忽略了这一点并将它们全部倒入同一个目录中? - Arman H
说实话,我还没有追踪到它们确切的来源,我只知道这种情况正在发生,我需要解决它。 这个网站非常大,所以我假设对于任何给定的页面都有很多引用。关于在什么条件下会创建重复内容,我不太确定。 - Steve Occhipinti
2个回答

2
httrack的效果已经非常不错了,唯一需要解决的问题是链接的指向会变为/folder/index.html而不是/folder/
使用httrack或者wget都无法达到完美的URL结构,因此我们编写了一个小的bash脚本,先运行爬虫程序,然后再使用sed清理一些URL(删除链接中的index.html,将bla.1.html替换为bla.html等)。

1

wget的描述和帮助

根据这个(以及我自己的快速实验),您应该没有问题使用-nc和-k选项一起获取您想要的页面。

会导致问题的是使用-N与-nc(完全不兼容,无法工作),因此您将无法通过时间戳比较文件并仍然不覆盖它们,并且使用--mirror选项时,您已经包含了-N。

与其使用--mirror,不妨尝试用“-r -l inf”替换它,这将启用无限级别的递归下载,但仍允许您的其他选项工作。

以下是一个基于您原始内容的示例:

wget -r -l inf -k -nc -nH -p -E -e robots=off http://yoursite

注:我建议使用-w 5 --random-wait --limit-rate=200k,以避免DOS服务器并且更加礼貌,但这显然取决于您。

一般来说,我尽量避免使用像--mirror这样的选项组合,因为像这样的冲突更难追踪。

我知道这是对一个非常古老的问题的答案,但我认为它应该得到解决 - wget是一个新命令对我来说,但到目前为止证明是非常有价值的,我希望其他人也能感受到同样的价值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接