使用 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 变量(只是一个文本字符串),用于通知服务器有关技术的信息。
您可以在这里检查您的浏览器代理 ->http://whatsmyuseragent.com
根据 WGET 手册,此参数应该可以完成这项工作
--user-agent=AGENT
。
如果这没有帮助,即可能需要 JavaScript 处理才能获取与浏览器相同的页面,或者可能需要使用 GET 参数的适当请求,以便服务器准备不需要 JavaScript 来填充页面的答案。