javascript – Phantomjs不执行page.evaluate函数的功能

我正在使用PhantomJS节点模块( https://github.com/sgentle/phantomjs-node)抓住Facebook页面,但是当我尝试评估页面时,它不会评估我传递给它的功能.在独立脚本中执行它并使用Node解释器运行它.Express.js应用程序中的相同代码不起作用.

这是我的代码

facebookScraper.prototype.scrapeFeed = function (url,cb) {
    f = ':scrapeFeed:';

    var evaluator = function (s) {
        var posts = [];

        for (var i = 0; i < Feed_ITEMS; i++) {
            log.info(__filename+f+' iterating step ' + i);
            log.info(__filename+f+util.inspect(document,false,null));
        }

        return {
            news: posts
        };
    }

    phantom.create(function (ph) {
        ph.createPage(function (page) {
            log.fine(__filename+f+' opening url ' + url);
            page.open(url,function (status) {
                log.fine(__filename+f+' opened site? ' + status);
                setTimeout(function() {
                    page.evaluate(evaluator,function (result) {
                        log.info(__filename+f+'Scraped Feed: ' + util.inspect(result,null));
                        cb(result,ph);
                    });
                },5000);
            });
        });
    });
};

输出我得到:

{"level":"fine","message":"PATH/fb_regular.js:scrapeFeed: opening url <URL> ","timestamp":"2012-09-23T18:35:10.151Z"}
{"level":"fine","message":"PATH/fb_regular.js:scrapeFeed: opened site? success","timestamp":"2012-09-23T18:35:12.682Z"}
{"level":"info","message":"PATH/fb_regular.js:scrapeFeed: Scraped Feed: null","timestamp":"2012-09-23T18:35:12.687Z"}

所以,如你所见,它用空参数调用幻影回调函数(评估函数中的第二个参数),但是它不执行第一个参数(我的评估器函数,它打印迭代步骤X).

任何人都知道问题是什么?

解决方法

我不确定您正在使用什么版本的PhantomJS,但是对于评估脚本中1.6版本的文档,将记录所包含的页面中的结果.它不会登录到您的控制台.为了得到你必须绑定日志记录到onConsoleMessage事件的页面
page.onConsoleMessage = function (msg) { console.log(msg); };

因为结果不可用:page.evaluate函数接受这样的参数 – 第一个是要执行的函数,其余的作为输入传递给该函数.结果直接返回:

var title = page.evaluate(function (s) {
    return document.querySelector(s).innerText;
 },'title');
 console.log(title);

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...