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

use*_*598 44 wget

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

更多信息:

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

lem*_*eze 48

正如roadmr 所指出的,此页面上的表格是由javascript 生成的。wget 不支持 javascript,它只是转储从服务器接收到的页面(即在任何 javascript 代码运行之前),因此缺少表。

你需要一个像phantomjs这样支持 javascript 的无头浏览器:

$ phantomjs save_page.js http://example.com > page.html
Run Code Online (Sandbox Code Playgroud)

使用 save_page.js:

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

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

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

$ w3m -dump page.html
Run Code Online (Sandbox Code Playgroud)

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

  • 2018 年:PhantomJS 项目暂停,直至另行通知:( (2认同)

小智 14

你可以下载一个完整的网站使用 wget --mirror

例子:

wget --mirror -p --convert-links -P ./LOCAL-DIR WEBSITE-URL
Run Code Online (Sandbox Code Playgroud)

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

选项:

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

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

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

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

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

  • 这不适用于 javascript 呈现的内容。为此,您需要使用 phantomjs,如lemensqueeze 的回答。 (6认同)
  • 此 cmd 也将遍历所有子 URL,这将下载呈现给定网页不需要的资源。 (2认同)

roa*_*dmr 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.
Run Code Online (Sandbox Code Playgroud)

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


Esa*_*amo 2

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


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

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


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