我正在使用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);