我正在尝试为一个项目下载整个网站。我在 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。假设此过程持续到某个任意高的数字。