如何使用 Wget 下载整个网站以供离线查看?

如何使用 Wget 下载整个网站以供离线查看?

我想下载一个相对较小的网站(约 50 页)的全部内容以供离线查看。

我可以手动在浏览器中打开每个页面并通过ctrl+下载它们s,这样就可以得到所需的结果。但是对于这种规模的网站来说,这会花费很长时间,组织起来也很费时,而且很容易出现人为错误(页面丢失、页面放在错误的目录中等)。

Wget 及其递归功能似乎是一个很好的解决方案,但我无法获得所需的结果。

期望的结果。

每一页在一个域上以及每个页面(可能位于其他域)所需的所有资源都需要下载。仅此而已。

问题

很多必需的资源都在外部域上。这些域数量众多,随时可能发生变化,并且不容易获得准确的列表。

我最好的尝试

我尝试了这个命令:

wget -r -k -p -H -l inf -w 1 --limit-rate=40k -H -e robots=off https://my.desired.website/

  • -r用于递归下载页面。
  • -k用于转换链接以简化离线查看。
  • -p用于告诉 Wget 下载所需的资源。
  • -H允许主机跨接而不受限制。
  • -l inf用于确保所需网站上的每个页面都将被下载,无论其页面层次有多深。
  • -w 1 --limit-rate=40k用于限制下载速率和速度,以免对主机不礼貌。
  • -e robots=off告诉 Wget 忽略“robots.txt”文件和“nofollow”链接。

不幸的是,由于该-H标志,此命令不仅会下载所需网站的每个页面,还会继续跟踪所有外部链接并下载它找到的每个网站的全部内容。这可能会导致尝试下载整个公共网站。

但是,如果没有该-H标志,它就不会下载查看网站所需的外部资源(即托管在外部域上的图像、JS、CSS 等)

然后你可能会说我应该使用标志-D,并将保存外部资源的每个域列入白名单。这也不是一个很好的解决方案,因为我无法完全控制网站的托管位置……托管资源的外部域列表可能随时更改,我无法可靠地手动找到每个域而不会遗漏任何域。

“真正”的问题

所以本质上我的问题是:

是否可以只允许 Wget 在下载时跨越主机必需品资源?

如果没有,是否有允许此类下载的工具?

答案1

不。目前,Wget 中没有内置方法允许您仅跨越主机来获取必要的资源。

如果必须使用 Wget,则接受的答案来自Stack Overflow 上的这个问题可能会对你有帮助。

如果你想使用其他工具,也许HT轨道值得研究。

请记住,这两种解决方案都不会执行 JavaScript 并保存浏览器中显示的最终网页。因此,如果您尝试以最终用户看到的方式存档/备份网站,则可能需要更深入地研究此主题,并且您的解决方案可能需要多个步骤和多个工具。

相关内容