为什么wget只会下载某些网站的index.html文件?

64

我正在尝试使用wget命令:

wget -p http://www.example.com 

如何获取主页面上的所有文件。对于一些网站,这可能有效,但在大多数情况下,它只能下载index.html。我尝试了wget -r命令,但它无效。有人知道如何获取页面上的所有文件,或者只是给我一个文件列表和相应的URL?


这与您之前的问题有何不同?如果是相同的问题,请编辑您的旧问题以澄清。 - Emil Vikström
8个回答

109
Wget也能够下载整个网站。但是由于这可能给服务器带来很大的负载,所以wget会遵守robots.txt文件。
wget -r -p http://www.example.com

-p参数告诉wget包括所有文件,包括图片。这意味着所有HTML文件将显示正确。

那么如果你不想让wget遵守robots.txt文件怎么办?你可以简单地在命令中添加-e robots=off,像这样:

wget -r -p -e robots=off http://www.example.com

许多网站不允许你下载整个网站,它们会检查你的浏览器身份。为了绕过这个限制,就像我上面解释的那样,使用-U mozilla。
wget -r -p -e robots=off -U mozilla http://www.example.com

很多网站所有者不喜欢你下载他们的整个网站。如果服务器发现你正在下载大量文件,可能会自动将你加入黑名单。解决这个问题的方法是在每次下载后等待几秒钟。使用wget命令实现这一点的方法是包含--wait=X参数(其中X是等待的秒数)。
你还可以使用参数--random-wait让wget选择一个随机的等待时间。要将其包含到命令中:
wget --random-wait -r -p -e robots=off -U mozilla http://www.example.com

5
谢谢您的回答。我尝试了您提到的3种方法在一些常见的网址上(例如amazon.com),但我只得到了index.html文件。您有其他建议吗? - Jay H
4
一样。只有index.html。 - BigSack
6
请尽量不要使用会被重定向的网址作为地址,例如如果你使用http://amazon.com,它将无法正常工作,因为你将被重定向到www.amazon.com,但是如果你使用http://www.amazon.com,则可以下载整个网站。忽略机器人文件并不太礼貌,所以它的效果可能不如你想象的那么好。 - Stefano Falsetto
2
我讨厌最有价值的答案在网站底部。 - user4757174
1
除了 --random-wait 之外,还可以使用参数 -w X,其中 X 是以秒为单位的时间,并用作计算随机等待时间的基础值。 - S.I.

43

首先,为了澄清问题,目的是下载index.html和该页面的所有必需部分(图像等)。 -p选项相当于--page-requisites

页面需求不总是被下载的原因在于它们通常托管在与原始页面不同的域上(例如CDN)。默认情况下,wget拒绝访问其他主机,因此您需要使用--span-hosts选项启用主机跨度

wget --page-requisites --span-hosts 'http://www.amazon.com/'
如果您需要能够加载index.html并使所有页面必需品从本地版本加载,您需要添加--convert-links选项,以便 src属性中的URL(例如)被重写为指向本地版本的相对URL。
可选地,您可能还想通过添加--no-host-directories选项将所有文件保存在单个“主机”目录下,或者通过添加--no-directories选项将所有文件保存在单个扁平目录中。
使用--no-directories将导致许多文件下载到当前目录,因此您可能希望使用--directory-prefix为输出文件指定文件夹名称。
wget --page-requisites --span-hosts --convert-links --no-directories --directory-prefix=output 'http://www.amazon.com/'

感谢您宝贵的回答。在我授予奖励之前,您能否添加一些额外的信息,使其更加通用。例如,在此链接下 http://indiabix.com/civil-engineering/questions-and-answers/ ,我希望wget访问每个类别/章节并下载所有图像,包括左侧边栏中每个部分中每个页面上的所有图像。请注意,这里的图像是指所有问题中涉及的数学公式的图像。 问题在于下载在下载index.html后停止了。如果有一个可行的示例就太好了! - Naveen
@InsaneCoder,你可能需要另外提出一个问题,并展示你已经尝试过的内容,因为递归获取是完全不同的一组问题,而且(据我所知)并不是原始问题所询问的内容。 - Alf Eaton
@InsaneCoder 添加 --mirror 选项是最直接的方法,可能已经足够满足您的需求。 - Alf Eaton
@AlfEaton 感谢您的关心。您可以尝试使用以下命令来检查结果:wget -rkEpHN -e robots=off -U mozilla http://www.yinwang.org/wget -rkEpHN -Dyinwang.org -e robots=off -U mozilla http://www.yinwang.org/。请检查结果。 - Evan Hu
@EvanHu 这些命令使用了“-r”(递归)标志,因此与此问题/答案无关。 - Alf Eaton
显示剩余3条评论

8
您提供的链接是主页或/index.html,因此很明显您只能获取一个index.html页面。如果要实际下载,例如“test.zip”文件,您需要在末尾添加确切的文件名。例如使用以下链接下载test.zip文件:

wget -p domainname.com/test.zip

使用 wget --mirror 下载完整网站
当您想下载整个网站并使其可供本地查看时,请执行以下命令行:

wget --mirror -p --convert-links -P ./LOCAL-DIR http://www.example.com

  • –mirror:打开适合镜像的选项。

  • -p:下载所有必要的文件以正确显示给定的HTML页面。

  • –convert-links:下载后,将文档中的链接转换为本地查看。

  • -P ./LOCAL-DIR:将所有文件和目录保存到指定目录中

使用wget -r -A仅下载特定文件类型

您可以在以下情况下使用此功能:

  • 从网站下载所有图片,

  • 从网站下载所有视频,

  • 从网站下载所有PDF文件

wget -r -A.pdf http://example.com/test.pdf


2
谢谢。--mirror选项最终让我成功了。 - vergenzt

5

另一个问题可能是您要镜像的站点使用没有 www 的链接。因此,如果您指定

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

它将不会下载任何链接的(内部)页面,因为它们来自于“不同”的域名。如果是这种情况,则使用

wget -p -r http://example.com

代替(去掉 www)。


2
正确的观察。这是我问题的根本原因。 - Evan Hu

5

我在下载CFSv2模型文件时遇到了同样的问题。我解决了这个问题,采用了上面几位回答的混合方法,并添加了参数--no-check-certificate.

wget -nH --cut-dirs=2 -p -e robots=off --random-wait -c -r -l 1 -A "flxf*.grb2" -U Mozilla --no-check-certificate https://nomads.ncdc.noaa.gov/modeldata/cfsv2_forecast_6-hourly_9mon_flxf/2018/201801/20180101/2018010100/

下面是每个参数的简要解释,更多详细信息请参考GNU wget 1.2手册

  • -nH 相当于 --no-host-directories:禁用主机前缀目录的生成。在此情况下,避免生成目录./https://nomads.ncdc.noaa.gov/

  • --cut-dirs=<number>:忽略指定数量的目录组件。在此情况下,避免生成目录./modeldata/cfsv2_forecast_6-hourly_9mon_flxf/

  • -p 相当于 --page-requisites:该选项使Wget下载所有必要文件以正确显示给定HTML页面,包括内嵌图像、声音和引用的样式表。

  • -e robots=off:避免下载robots.txt文件。

  • -random-wait:使请求之间的时间在0.5和1.5 *秒之间变化,其中使用--wait选项指定了秒数。

  • -c 相当于 --continue:继续获取部分下载的文件。

  • -r 相当于 --recursive:打开递归检索。默认最大深度为5。

  • -l <depth> 相当于 --level <depth>:指定递归最大深度级别

  • -A <acclist> 相当于 --accept <acclist>:指定要接受的名称后缀或模式的逗号分隔列表。

  • -U <agent-string> 相当于 --user-agent=<agent-string>:HTTP协议允许客户端使用User-Agent头字段标识自己。这使得能够区分WWW软件,通常用于统计目的或跟踪协议违规情况。Wget通常以“Wget/version”为身份标识,其中版本是Wget当前版本号。

  • --no-check-certificate:不检查服务器证书与可用证书颁发机构的匹配性。


是-e robots=off让我成功了! - Shawn

3

我知道这个帖子有点旧,但是可以尝试一下Ritesh提到的方法:

--no-cookies

对我来说起作用了!


1
如果你只得到 index.html 文件,并且该文件看起来只包含二进制数据(即没有可读的文本,只有控制字符),那么该站点可能正在使用 gzip 压缩传输数据。
您可以通过运行 cat index.html | gunzip 来确认这一点,以查看是否输出可读的 HTML。
如果是这种情况,则 wget 的递归功能(-r)将无法工作。对于 wget 来处理 gzip 压缩的数据,有一个 patch,但似乎尚未在标准版本中发布。

1
如果您在wget手册中查找index.html,您可以找到一个选项--default-page=name,默认情况下为index.html。 您可以更改为例如index.php
--default-page=index.php

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接