【问题标题】:Why does wget only download the index.html for some websites?为什么wget只下载某些网站的index.html?
【发布时间】:2012-06-22 20:51:37
【问题描述】:

我正在尝试使用 wget 命令:

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

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

【问题讨论】:

标签: wget


【解决方案1】:

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

【讨论】:

  • 感谢您的回答。我尝试了您在一些常见网址(例如 amazon.com)上提到的 3 种方式,但我得到的只是 index.html。您还有什么建议吗?
  • 这里也一样。只有 index.html
  • @JayH 尝试不使用将被重定向的地址。即,如果您使用http://amazon.com,它将无法正常工作,因为您将被重定向到 www.amazon.com,但如果您使用http://www.amazon.com,它将开始下载所有站点。不关注机器人文件的能力不是那么“礼貌”,所以它不会像你想象的那么好。
  • 我讨厌网站底部最有价值的答案
  • 除了--random-wait之外,还可以使用参数-w X,其中X是以秒为单位的时间,它用作计算随机等待时间的基值。
【解决方案2】:

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

页面必备项并不总是被下载的原因是它们通常托管在与原始页面不同的域(例如 CDN)上。默认情况下为wget refuses to visit other hosts,因此您需要使用--span-hosts 选项启用主机跨接

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

如果您需要能够加载 index.html 并从本地版本加载所有页面必备项,则需要添加 --convert-links 选项,以便 img 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 后下载停止。这种情况下的工作示例会很棒!!!
  • @InsaneCoder 您可能想为此开始一个单独的问题并展示您尝试过的内容,因为递归获取是另一组问题,并且(据我了解)不是什么原来的问题是问的。
  • @InsaneCoder 添加--mirror 选项是最直接的,可能足以满足您的需求。
  • 小心使用--span-hosts,添加-D<domain-list> 以限制跨越到某些域。
  • @EvanHu 在此处添加域白名单无济于事,因为 wget 需要能够在托管页面的任何地方获取所需的页面。
【解决方案3】:

您提供的链接是主页或/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

【讨论】:

  • 谢谢。 --mirror 选项最终使它对我有用。
【解决方案4】:

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

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

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

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

改为(没有www)。

【讨论】:

  • 正确观察。这是我的问题的根本原因。
【解决方案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 Manual

  • -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 为我做的!
【解决方案6】:

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

--无cookies

它对我有用!

【讨论】:

    【解决方案7】:

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

    --default-page=index.php
    

    【讨论】:

      【解决方案8】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多