您如何使用WGET来镜像一级站点,以恢复JS,CSS资源(包括CSS图像)?


11

假装我想将一个简单的页面副本下载到我的高清机中以永久保存。我不是在寻找深层递归获取,只是在寻找单个页面,也不希望下载该页面加载的任何资源。

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

期望:

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

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

切线解

我找到了使用FireFox做到这一点的方法。默认保存已中断,并且有一个名为“保存完成”的插件,显然可以很好地完成此工作。但是,您无法下载它,因为它说当前的FireFox版本不支持它。原因是它已被卷入以下附加组件:“ Mozilla存档格式”。安装该文件,然后在使用“文件”>“页面另存为..”时,有一个名为“完整的网页”的新选项,它实际上是旧的插件,它修复了FireFox使用的原始实现(这很糟糕)。这不是WGET解决方案,但确实提供了可行的解决方案。

编辑:对于将来可能追随此问题并试图这样做的任何人来说,这都是一个荒谬的问题。要使插件正常工作,需要在工具> Mozilla存档格式上进行设置,并将(获取页面的真实快照)默认设置(可怕的)更改为“使用保存完成来保存脚本和源代码”,否则插件将清空所有您的脚本文件,并将其替换为文本“ / *被快照保存* /删除的脚本”。


文件>另存为firefox或其他浏览器,将下载所有图像,js和css文件
2011年

您实际上是想要这些文件,还是只想要页面的正确呈现版本?

我想要这些文件,无论如何它们都需要正确呈现页面。如果您没有它们,则外观会有所不同。文件>另存为在Firefox中不起作用。如果执行此操作,则不会获得CSS图像。在tumblr.com/login上尝试一下。缺少背景图片,缺少输入字段的背景图片。

所有的wget解决方案都不适合我。我的切线解决方案是实现这种网站节省的最佳方法。但是,我看到它在非常复杂的页面(如apple.com)上失败了,大概是因为许多资源路径是通过执行javascript动态生成的,其中有些不是立即执行的,而是在某种ajax执行期间生成的。
拉娜·米勒

Answers:


12

wget -p -k http://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一起使用时非常重要的一个,因为如果您访问一个站点并且它们具有外部主机的多个链接(例如广告客户和分析人员),那么您也将获得该人员!

-不需要检查证书,因为tumblr使用https

-U更改用户代理。在这种情况下,由于它允许使用默认的wget用户代理,因此实际上不是必需的,但是我知道有些站点会阻止它。我只是将其放入此处,以防万一您在其他站点上遇到任何问题。在我提供的示例代码段中,它显示为Mozilla Firefox 6.02a

终于您有了这个网站:https : //www.tumblr.com


1
我试过了,没有得到任何JS或CSS或图像文件。你是否?

如果您在tumblr上使用它(上面的示例),则可能必须指定--no-check-certificate。

我认为您是对的,可能确实需要该选项。但是除了index.html之外什么都没有。缺少了一些东西……

@LanaMiller我更新了答案。让我知道是否有任何问题。

您可以不做-exclude-domains!= tumblr.com之类的事情吗?
alpha1

3

对于您提到的特定站点以及像wget(和curl)这样的许多其他代码,它们将不起作用。问题在于,在浏览器中呈现页面所需的某些资产链接本身是通过javascript创建的。Wget有一个功能请求正在等待运行javascript:

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

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


1

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

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

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


1
这将得到一切。阅读问题。
2011年

-1
wget -r http://www.example.com

我认为这可以抓住一切,但您可以尝试一下并找出答案。


1
它得到了太多的东西。到目前为止,我发现的FireFox解决方案是最佳的解决方案。它可以满足您的需求,仅此而已。

-1

$(man wget):

-p

--page-必要条件

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

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

例如,假设文档1.html包含引用1.gif的“ <IMG>”标签和指向外部文档2.html的“ <A>”标签。假设2.html相似,但其图像为2.gif,并且链接到3.html。说这继续上升到任意高的数字。

如果执行命令:

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

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

wget -r -l 2 -p http:// <site> /1.html

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

wget -r -l 1 -p http:// <site> /1.html

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

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

会只下载1.html和1.gif,但是不幸的是,不是这样,因为-l 0等效于-l inf--即无限递归。要下载单个HTML页面(或少数几个,全部在命令行或-i URL输入文件中指定)及其(或它们的)必要条件,只需关闭-r和-l:

wget -p http:// <站点> /1.html

请注意,Wget的行为就像已指定-r一样,但是仅下载该单个页面及其必备条件。该页面到外部文档的链接将不被关注。实际上,要下载一个页面及其所有必要条件(即使它们存在于单独的网站上),并确保全部内容在本地正确显示,除-p外,该作者还喜欢使用一些其他选项:

wget -E -H -k -K -p http:// <site> / <document&gt ;

要结束本主题,值得一提的是,Wget的外部文档链接概念是在“ <A>”标记,“ <AREA>”标记或“ <LINK>”标记(而不是“ < LINK REL =“ stylesheet”>“。


2
您认为哪一部分类似于解决方案?因为我尝试阅读手册页的内容,但在这里看不到正确的解决方案。您自己尝试过任何一种方法吗?您认为命令是什么专门解决了这个问题。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.