如何使用 wget 保存整个网站(包括内联 javascript 请求的文件)?

如何使用 wget 保存整个网站(包括内联 javascript 请求的文件)?

我正在尝试为一个项目下载整个网站。我在 Linux 上工作,通常使用此wget命令来完成这项工作

wget -r -p -k -E www.website.org

但对于这个特定的网站,并非所有图像都被下载了。

经过一些研究后,我还尝试了一些其他选项,例如:

wget -r -p -k -l 0 -E --no-check-certificate www.website.org

但图像仍然缺失。通过检查源代码,我注意到许多缺失的图像都是通过内联 javascript 请求的。例如:

<a href="index.php" onMouseOut="MM_swapImgRestore();"  
onMouseOver="MM_swapImage('button','','images/button_highlight.gif',1)" >
   <img name="button" src="images/button.gif">
</a>

有没有办法包含这些图像wget

答案1

并非如此,这不是wget设计的目的(curl例如,两者都不是)。Javascript 甚至可能会延迟加载图像一段时间,或等待图像出现在屏幕上(参见长滚动页面)。

就你的情况而言,可以以编程方式解析 javascript 代码以提取文件名(如images/button.gif),然后通过更多调用加载它们wget。但这当然不是解决该问题的通用方法。我也见过嵌入 javascript 的网页计算运行时的图像 URL/文件名 - 每个会话!

绕过这些 JavaScript 混淆措施的一个可行方法是将网页加载到标准浏览器中,但是通过本地代理squid我想到);然后检查(保存)代理缓存。

答案2

我不确定你的网站是如何构建的,但确实wget可以做到这一点,手册中有很多例子可以做到这一点。有一个关于的小注释--requisite,所以这取决于你网站的结构。我从来没有遇到过糟糕的问题,所以很难指出“修复”。

通常我会做这样的事情:

wget \
     --recursive \
     --no-clobber \
     --page-requisites \
     --adjust-extension \
     --convert-links \
     --restrict-file-names=unix \
     --domains <DOMAIN> \
     --no-parent \
     <URL>

您还可以尝试--mirror

wget \
     --mirror \
     --no-clobber \
     --page-requisites \
     --adjust-extension \
     --convert-links \
     --restrict-file-names=unix \
     --domains <DOMAIN> \
     --no-parent \
     <URL>

最后要说的是,如果您有一些文件的名称位于“Content-Disposable”标头中。(例如 domaine.com/something_that_returns_a_file.php)。如果您的版本支持,您可以尝试使用这些文件。您可以一起使用它们。

--content-disposition
--metalink-over-http
--trust-server-names

如果重定向给您带来一些麻烦,例如将您带回到主页,然后您开始下载,您可以设置--max-redirect=0

手册说明有点长,无法在这里完整地放出来,但它是这样开始的:

通常,下载单个 HTML 页面时,不会下载正确显示该页面所需的任何必需文档。将 -r 与 -l 一起使用可能会有所帮助,但由于 Wget 通常不区分外部文档和内联文档,因此通常会留下缺少必需文档的“叶文档”。

例如,假设文档 1.html 包含一个引用 1.gif 的“”标签和一个指向外部文档 2.html 的“”标签。假设 2.html 类似,但其图像为 2.gif,并链接到 3.html。假设此过程持续到某个任意高的数字。

相关内容