我想下载一个相对较小的网站(约 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 并保存浏览器中显示的最终网页。因此,如果您尝试以最终用户看到的方式存档/备份网站,则可能需要更深入地研究此主题,并且您的解决方案可能需要多个步骤和多个工具。