【问题标题】:phantomjs doesn't render a pagephantomjs 不呈现页面
【发布时间】:2016-02-14 04:01:54
【问题描述】:

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

奇怪的是有些网站没有正确呈现。其中,我有这个: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();
});

它以没有截图结束。与任何其他人一起测试,并且完美运行。 我是否忽略了什么?

【问题讨论】:

    标签: javascript phantomjs


    【解决方案1】:

    它不会呈现屏幕截图,因为页面最初没有<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


    您可能需要使用 --ignore-ssl-errors=true 运行 PhantomJS(如果 PhantomJS --ssl-protocol=any)。

    【讨论】:

    • 哈!它起作用了(尽管我不得不在 11 个有问题的网站中的 8 个中等待 30 秒,但也许我的连接速度真的很慢)。作为参考,在这些情况下我不需要使用--ignore-ssl-errors 标志来使其工作,但保持设置以防万一是件好事。谢谢!
    • 我也不需要忽略 ssl 错误,但我注意到日志中有一些请求错误(通过events 看到),所以我添加了该命令行选项,它们就消失了。
    • 30 秒有点多。也许您可以通过自定义广告拦截来节省几秒钟的时间。 page.onResourceRequested 事件使您能够根据您的自定义条件(如请求的域)中止一些请求。
    • 在浪费了一整天后添加 cliArgsCap.add("--ignore-ssl-errors=true") 帮助我解决了这个问题。这个 ssl 问题如何导致页面无法正常加载。但 FF/Chrome 工作正常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多