2017-09-14 1 views
1

Mon but est de récupérer certaines données d'un site Web en utilisant Node.js.Erreur PhantomJS: UnhandledPromiseRejectionWarning

J'ai déjà réussi à gratter les données en utilisant uniquement le package request, mais le site que je veux graver a un contenu dynamique et request ne peut pas saisir ces données dynamiques.

J'ai donc fait quelques recherches et a constaté que, pour y parvenir, et basée à this SO question, je besoin d'installer des paquets via npm (Je ne sais pas si les trois sont nécessaires):

trop Basé sur la question, j'utilise le même code, juste pour comprendre comment cela fonctionne:

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() 
     }); 
     }); 
    }); 
    }); 
}); 

Mais lorsque je tente de courir dans le terminal $ node myFile.js, il ne le font pas travailler et continue à me donner l'erreur:

(node:6576) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Unexpected type of parameters. Expecting args to be array.

(node:6576) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Des idées pour résoudre ce problème?

EDIT:

solution finale basée sur la réponse @Shyam (résolu l'erreur) et this example:

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)) 
; 

Répondre

3

Je ne sais pas où vous avez obtenu le format de mais le dernier fantôme JS ne n'utilise pas de rappels et utilise des promesses à la place. Et le constructor (Phantom.create) attend des configs sous forme de tableau et non une fonction de rappel.

Votre code doit être quelque chose de similaire à ce que je présume (je n'ai pas testé cela, mais devrait fonctionner).

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(); 
    }) 
+0

je n'étais pas en mesure d'obtenir la page de résultats avec vous la solution, je recevais seulement une chaîne « succès », mais votre code aidé à me montrer le chemin de le résoudre, en utilisant [cet exemple] (https://github.com/amir20/phantomjs-node/blob/master/examples/simple.js) dans github. Malheureusement, je n'ai toujours pas réussi à obtenir le contenu dynamique de la page et je ne renvoie que le contenu statique et les fonctions js, mais cela ne fait pas partie de cette question. Je vous remercie! – Lioo