PhantomJS错误:UnhandledPromiseRejectionWarning

我的目标是使用Node.js从网站上刮取一些数据。

我已经设法只使用request包来抓取数据,但是我想抓取的站点具有dynamic内容,并且request只能抓取这个dynamic数据。

所以我做了一些研究,发现为了达到这个目的,基于这个SO问题 ,我需要通过npm安装一些软件包( 我不知道是否需要这三个软件包):

  • 请求
  • Cheerio
  • 幻影

基于这个问题,我使用相同的代码,只是为了了解它是如何工作的:

myFile.js

 var phantom = require('phantom'); phantom.create(function (ph) { ph.createPage(function (page) { var url = "http://www.bdtong.co.kr/index.php?c_category=C02"; page.open(url, function() { page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() { page.evaluate(function() { $('.listMain > li').each(function () { console.log($(this).find('a').attr('href')); }); }, function(){ ph.exit() }); }); }); }); }); 

但是当我尝试运行在terminal$ node myFile.js ,它不工作,并不断给我的错误:

(节点:6576)UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:1):错误:意外types的参数。 期望参数是数组。

(节点:6576)弃用警告:不处理的承诺拒绝已被弃用。 将来,未处理的承诺拒绝将使用非零退出代码来终止Node.js进程。

任何想法如何解决这个问题?

编辑:

最后的解决scheme基于@Shyam的答案(解决了这个错误)和这个例子 :

 var phantom = require('phantom'); var _ph, _page, _outObj; phantom .create() .then(ph => { _ph = ph; return _ph.createPage(); }) .then(page => { _page = page; return _page.open('https:/www.google.com.br/'); }) .then(status => { console.log(status); return _page.property('content'); }) .then(content => { console.log(content); _page.close(); _ph.exit(); }) .catch(e => console.log(e)) ; 

我不知道你从哪里得到的格式,但最新的幻影JS不使用callback,而是使用承诺。 构造函数 (Phantom.create)期望以数组的forms进行configuration,而不是callback函数。

你的代码需要类似于这个我想(我没有testing过,但应该运行)。

 var phantom = require('phantom'); var _ph, _page; phantom.create() .then(function (ph) { _ph = ph; return ph.createPage(); }) .then(function (page) { _page = page; var url = "http://www.bdtong.co.kr/index.php?c_category=C02"; return page.open(url); }) .then(function(page) { page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() { page.evaluate(function() { $('.listMain > li').each(function () { console.log($(this).find('a').attr('href')); }); }); }); }) .catch(function(err) { _page.close(); _ph.exit(); })