如何使用 WGET 对站点进行 1 级深度镜像,恢复 JS、CSS 资源(包括 CSS 图像)?

如何使用 WGET 对站点进行 1 级深度镜像,恢复 JS、CSS 资源(包括 CSS 图像)?

假设我想要将一个简单的页面副本下载到我的硬盘中并永久保存。我不需要深度递归获取,只需要一个页面,同时还要下载该页面加载的任何资源。

例子:https://www.tumblr.com/

预计:

  • index.html
  • 任何已加载的图像
  • 任何已加载的 JS 文件
  • 任何已加载的 CSS 文件
  • CSS 文件中加载的任何图像
  • 页面资源的链接已本地化,可与下载的副本一起使用(不依赖网络)

我想知道您是否能帮我找到最好的 wget 语法或其他可以做到这一点的工具。我尝试过的工具通常无法通过 CSS 加载图像,因此页面在本地加载时看起来总是不正确。谢谢!

切线解

我找到了一种使用 FireFox 来实现此目的的方法。默认保存已损坏,有一个名为“保存完成”的插件显然可以很好地完成此任务。但是,您无法下载它,因为它说当前版本的 FireFox 不支持它。原因是它被整合到这个插件中:“Mozilla 存档格式”。安装它,然后当您使用文件 > “将页面另存为...”时,会有一个名为“网页,完成”的新选项,它本质上是旧插件,它修复了 FireFox 使用的常规实现(这很糟糕)。这不是 WGET 解决方案,但它确实提供了一个可行的解决方案。

编辑:对于将来可能关注此问题并尝试这样做的人来说,这是另一个荒谬的问题。要使插件正常工作,您需要转到“工具”>“Mozilla 存档格式”,并将(糟糕的)默认设置“拍摄页面的忠实快照”更改为“使用“保存完成”保留脚本和源代码”,否则插件将清空所有脚本文件并将其替换为文本“/* 快照保存删除了脚本 */”。

答案1

wget -p -khttp://ExampleSite.com

-p 将为您提供正确查看网站所需的所有元素(css、图像等)。-k 将更改所有链接(包括 CSS 和图像的链接),以便您离线查看页面时,就像在线显示一样。

更新: 这是针对您的示例网站:tumblr.com

wget -H -N -k -p --exclude-domains quantserve.com --no-check-certificate -U "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0a2) Gecko/20110613 Firefox/6.0a2" https://www.tumblr.com

细分:

-H = 允许 wget 跨越外部主机。这是必需的,因为 tumblr 在同一地址的首页上没有自己的图片,他们使用的是 secure.assets.tumblr.com请参阅有关排除域的说明

-N = 将仅抓取比当前文件更新的文件,以防您随着时间的推移再次下载同一页面

-k = 转换您的链接以便正确地离线查看

-p = 抓取所有需要的元素以正确查看(css、图像等)

--exclude-domains = 因为 tumblr.com 主页有一个 quantserve.com 的链接,而我猜您不想要这些东西,所以您需要将其从 wget 下载中排除。笔记:这是一个非常重要的选项,您应该将其与 -H 一起使用,因为如果您访问某个网站,并且他们有多个外部主机的链接(想想广告商和分析内容),那么您也会抓取这些内容!

--no-check-certificate 是必需的,因为 tumblr 使用 https

-U 更改用户代理。在这种情况下,它并不是必需的,因为它允许默认的 wget 用户代理,但我知道有些网站会阻止它。我只是把它放在这里,以防您在其他网站上遇到任何问题。在我给出的示例代码片段中,它显示为 Mozilla Firefox 6.02a

最后你有了这个网站:https://www.tumblr.com

答案2

对于您提到的特定网站以及许多其他类似编码的网站,wget(和 curl)根本不起作用。问题是,在浏览器中呈现页面所需的某些资产链接本身是通过 javascript 创建的。Wget 有一个待处理的功能请求以运行 javascript:

http://wget.addictivecode.org/FeatureSpecifications/JavaScript

但是,在此之前,使用 javascript 构建资产链接的站点将无法使用 wget 进行克隆。最简单的解决方案是找到一个真正构建 DOM 并像浏览器引擎一样解析 javascript 的工具(即您提到的 Firefox 方法)。

答案3

您还可以通过使用 wget 通过 shell 发出命令来自动执行此操作(如果您进行编码,则可以通过编程来执行此操作):

wget --convert-links -r http://www.yourdomain.com

它将下载页面和内部文件并使链接成为本地链接。

答案4

$(男子wget):

-p

--页面必备条件

此选项使 Wget 下载正确显示给定 HTML 页面所需的所有文件。其中包括内联图像、声音和引用的样式表。

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

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

如果执行以下命令:

wget -r -l 2http://<站点>/1.html

然后将下载 1.html、1.gif、2.html、2.gif 和 3.html。如您所见,3.html 没有其必需的 3.gif,因为 Wget 只是计算距离 1.html 的跳数(最多 2 个)以确定在哪里停止递归。但是,使用以下命令:

wget -r -l 2 -phttp://<站点>/1.html

上述所有文件和 3.html 所需的 3.gif 都将被下载。同样,

wget -r -l 1 -phttp://<站点>/1.html

将导致下载 1.html、1.gif、2.html 和 2.gif。有人可能会认为:

wget -r -l 0 -phttp://<站点>/1.html

只会下载 1.html 和 1.gif,但不幸的是事实并非如此,因为 -l 0 相当于 -l inf——即无限递归。要下载单个 HTML 页面(或其中几个,全部在命令行或 -i URL 输入文件中指定)及其(或它们的)必备项,只需省略 -r 和 -l:

wget -phttp://<站点>/1.html

请注意,Wget 的行为就像指定了 -r 一样,但只会下载该单个页面及其必需项。不会跟踪从该页面到外部文档的链接。实际上,要下载单个页面及其所有必需项(即使它们存在于不同的网站上),并确保这些内容在本地正确显示,本文作者喜欢使用除 -p 之外的几个选项:

wget -E -H -k -K -phttp://<站点>/<文档>

为了完成这个话题,值得知道的是,Wget 对外部文档链接的概念是在“<A>”标签、“<AREA>”标签或“<LINK>”标签中指定的任何 URL,而不是“<LINK REL="stylesheet">”。

相关内容