59

我正在尝试使用 wget 命令:

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

获取主页上的所有文件。对于某些网站,它可以工作,但在大多数情况下,它只下载 index.html。我已经尝试了 wget -r 命令,但它不起作用。任何人都知道如何获取页面上的所有文件,或者只是给我一个文件列表和页面上相应的 url?

4

8 回答 8

103

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
于 2012-06-20T17:10:23.453 回答
39

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

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

wget --page-requisites --span-hosts 'http://www.amazon.com/'

如果您需要能够index.html从本地版本加载并加载所有页面必备项,则需要添加该--convert-links选项,以便将imgsrc 属性中的 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/'
于 2014-08-22T09:45:48.077 回答
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

于 2014-08-21T20:26:09.673 回答
5

另一个问题可能是您要镜像的站点使用的链接没有www. 所以如果你指定

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

它不会下载任何链接(实习)页面,因为它们来自“不同”域。如果是这种情况,那么使用

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

相反(没有www)。

于 2015-08-30T20:43:47.527 回答
4

我在下载 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:不要根据可用的证书颁发机构检查服务器证书。

于 2019-03-21T23:55:01.793 回答
3

我知道这个线程很旧,但请尝试 Ritesh 提到的内容:

--no-cookies

它对我有用!

于 2014-03-10T05:54:01.383 回答
1

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

--default-page=index.php
于 2013-11-17T00:24:31.523 回答
1

如果您只得到index.html并且该文件看起来只包含二进制数据(即没有可读文本,只有控制字符),那么该站点可能正在使用gzip压缩发送数据。

cat index.html | gunzip您可以通过运行以查看它是否输出可读的 HTML来确认这一点。

如果是这种情况,则wget的递归功能 ( -r) 将不起作用。有一个用于处理 gzip 压缩数据的补丁wget,但它似乎还没有出现在标准版本中。

于 2017-09-01T09:29:30.417 回答