如何让 WGET 下载与浏览器完全相同的网页 html

如何让 WGET 下载与浏览器完全相同的网页 html

使用 Web 浏览器(IE 或 Chrome),我可以使用 Ctl-S 保存网页(.html),使用任何文本编辑器检查它,并查看表格格式的数据。我想提取其中一个数字,但对于很多网页来说,太多了​​,无法手动提取。因此,我想使用 WGET 依次获取这些网页,然后编写另一个程序来解析 .html 并检索我想要的数字。但是,当使用与浏览器相同的 URL 时,WGET 保存的 .html 文件不包含数据表。为什么不呢?就好像服务器检测到请求来自 WGET 而不是来自 Web 浏览器,并提供一个没有数据表的骨架网页。如何使用 WGET 获取完全相同的网页?- 谢谢!

更多信息:

我尝试获取的 URL 示例如下: http://performance.morningstar.com/fund/performance-return.action?t=ICENX®ion=usa&culture=en-US 其中字符串 ICENX 是共同基金股票代码,我将把它更改为许多不同的股票代码。在浏览器中查看时,这会下载一个数据表,但如果使用 WGET 获取,则数据表会丢失。

答案1

作为路先生注意,此页面上的表格是由 javascript 生成的。wget 不支持 javascript,它仅转储从服务器接收到的页面(即在任何 javascript 代码运行之前),因此表格丢失。

你需要一个支持 JavaScript 的无头浏览器,例如幻影

$ phantomjs save_page.js http://example.com > page.html

使用 save_page.js:

var system = require('system');
var page = require('webpage').create();

page.open(system.args[1], function()
{
    console.log(page.content);
    phantom.exit();
});

然后,如果您只想提取一些文本,最简单的方法可能是使用 w3m 呈现页面:

$ w3m -dump page.html

和/或修改 phantomjs 脚本以仅转储您感兴趣的内容。

答案2

您可以使用下载完整网站wget --mirror

例子:

wget --mirror -p --convert-links -P ./LOCAL-DIR WEBSITE-URL

当您想要下载完整网站并供本地查看时,需要执行上述命令行。

选项:

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

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

  • --convert-links下载后,转换文档中的链接以供本地查看。

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

有关 Wget 选项的更多信息请阅读本文: 有关所有 wget 命令的概述及示例或检查Wget 的手册页

答案3

不要--recursive使用 ,它只会继续“抓取”您 URL 中的每个链接,而要使用--page-requisites。其行为应与您在图形浏览器中描述的选项完全相同。

       This option causes Wget to download all the files that are
       necessary to properly display a given HTML page.  This includes
       such things as inlined images, sounds, and referenced stylesheets.

       Ordinarily, when downloading a single HTML page, any requisite
       documents that may be needed to display it properly are not
       downloaded.  Using -r together with -l can help, but since Wget
       does not ordinarily distinguish between external and inlined
       documents, one is generally left with "leaf documents" that are
       missing their requisites.

要了解更多信息,请执行man wget并查找--page-requisites选项(阅读手册页时使用“/”进行搜索)。

答案4

如果服务器的答案根据请求源而不同,这主要是因为请求源在请求中提供了 HTTP_USER_AGENT 变量(只是一个文本字符串),用于通知服务器有关技术的信息。


  1. 您可以在这里检查您的浏览器代理 ->http://whatsmyuseragent.com

  2. 根据 WGET 手册,此参数应该可以完成这项工作 --user-agent=AGENT


如果这没有帮助,即可能需要 JavaScript 处理才能获取与浏览器相同的页面,或者可能需要使用 GET 参数的适当请求,以便服务器准备不需要 JavaScript 来填充页面的答案。

相关内容