2015-11-12 143 views
3

我今天在许多网站上做了一些研究,为了避免手动查看它们,我准备了phantomjs以使用建议的解决方案here来呈现它们。没什么特别的。循环访问网站数组并渲染所有生成的页面。phantomjs不呈现页面

奇怪的是,有些网站没有正确渲染。其中,我有这样的一个:http://www.telegraaf.nl/

为了简化,我创造了另一个脚本,只运行此页:它在没有截图结束

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

page.viewportSize = { width: 1920, height: 960 }; 
page.clipRect = { top: 0, left: 0, width: 1920, height: 960 }; 

page.open('http://www.telegraaf.nl/', function(status) { 
    page.render("screenshot.png"); 
    phantom.exit(); 
}); 

。与任何其他人一起测试,并完美的工作。 我忽略了什么?

回答

6

它没有渲染屏幕截图,因为页面最初没有<body>,因此没有渲染。在PhantomJS的onLoadFinished事件触发后,所有内容,包括正文,都通过JavaScript加载。

您需要稍等一下才能完成整页加载。一个简单的5秒的等待足以对我来说:

page.open('http://www.telegraaf.nl/', function(status) { 
    setTimeout(function(){ 
     page.render("screenshot.png"); 
     phantom.exit(); 
    }, 5000); 
}); 

当然,你可以等待更奇特的方式,以使其更加坚固并太久没有等待:phantomjs not waiting for “full” page load


你可能需要运行PhantomJS --ignore-ssl-errors=true(也许--ssl-protocol=any如果PhantomJS < 1.9.8)。

+0

哈!它有效(尽管我必须在11个_problematic_网站中的8个中等待30秒,也许我的连接非常慢)。作为参考,在这些情况下,我不需要使用'--ignore-ssl-errors'标志来工作,但保持设置以防万一,这是一件好事。谢谢! – Korcholis

+0

我也不需要忽略ssl错误,但我注意到那里有一些请求日志错误(通过[events](https://gist.github.com/artjomb/4cf43d16ce50d8674fdf#file-1_phantomerrors-js )),所以我添加了该命令行选项,并且他们离开了。 –

+0

30秒有点多。也许你可以通过自定义广告屏蔽来减少几秒钟的时间。通过'page.onResourceRequested'事件,您可以根据您的自定义条件(如请求的域)中止某些请求。 –