16

我正在尝试使用 PhantomJS 截取网页的屏幕截图。具体来说,我使用的是espn.com这个例子中捕获的例子。我的代码如下所示:

var page = new WebPage(); 
    page.open('http://www.espn.com', function (status) {
    page.render('fb.png');
    phantom.exit();
});

然后我使用终端或命令提示符转到我的 PhantomJS 目录并运行:

phantomjs shotty.js

一切运行良好,但完成输出图像需要 6-8 秒。这正常吗?有没有更快的方法来完成这项工作,以便在一秒钟或更短的时间内完成?

我使用的是 CentOS 和 Windows 7。两个机器都有 8GB 的​​ RAM,3.2 GHz CPU,我在 speedtest.net 上的速度下降了 22Mbp/s,上升了 1Mbp/s

4

3 回答 3

24

好吧,在我的例子中,页面正在等待一些 GET 请求并且无法到达请求的服务器并且它一直等待很长时间。我只有在使用远程调试器选项时才能弄清楚。

phantomjs --remote-debugger-port=9000 loadspeed.js <some_url>

并在loadspeed.js文件中添加以下代码:

page.onResourceRequested = function (req) {
    console.log('requested: ' + JSON.stringify(req, undefined, 4));
};

page.onResourceReceived = function (res) {
    console.log('received: ' + JSON.stringify(res, undefined, 4));
};

然后在任何 webkit 浏览器(safari/chrome)中加载 localhost:9000 并查看控制台日志,我可以在其中发现它正在等待一些无法访问的请求很长时间。

绕过这个 - 通过在同一个loadspeed.js文件中添加以下内容来减少超时:

page.settings.resourceTimeout = 3000; //in milliseconds

在那之后事情进展得很快。希望这可以帮助

于 2013-11-13T06:28:08.520 回答
9

是的,这很正常。当您尝试渲染时,PhantonJS 仍将等待page.open事件触发load事件以表示整个 DOM 已加载。

看看当我espn.com在系统上本地加载时会发生什么。DOMContentLoaded 完成大约需要 2 秒,然后ready事件触发需要大约 7 秒。

在此处输入图像描述

于 2012-10-30T17:22:08.020 回答
2

我不认为以下会起作用,但对我来说它确实(在 Windows 上):

打开 Internet Explorer > Internet 选项 > 连接 > LAN 设置并禁用“自动检测设置”

原帖: https: //plus.google.com/+MatthiasG%C3%B6tzke/posts/9v9BMCJj2k6

于 2015-08-05T22:09:51.747 回答