Ошибка PhantomJS: UnhandledPromiseRejectionWarning

1

Моя цель - очистить некоторые данные с веб-сайта с помощью Node.js.

Мне уже удалось очистить данные, используя только пакет request, но сайт, на котором я хочу очистить, имеет динамический контент, и request только не может захватить эти динамические данные.

Поэтому я сделал некоторые исследования и обнаружил, что для достижения этого и на основе этого вопроса SO мне нужно будет установить некоторые пакеты через npm (я не знаю, нужны ли все три):

Исходя из этого вопроса, я использовал тот же код, чтобы понять, как он работает:

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

Но когда я пытаюсь запустить в терминале $ node myFile.js, он не работает и продолжает давать мне ошибку:

(node: 6576) UnhandledPromiseRejectionWarning: Отказ от необработанного обещания (id отклонения: 1): Ошибка: Неожиданный тип параметров. Ожидается, что args будут массивом.

(узел: 6576). Устаревание. Предупреждение. Отклонения от необработанных обещаний устарели. В будущем обещание отклонения, которое не обрабатывается, приведет к завершению процесса Node.js с ненулевым кодом выхода.

Есть идеи, как это решить?

РЕДАКТИРОВАТЬ:

Окончательное решение, основанное на ответе @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))
;
Теги:
web-scraping
npm
phantomjs

1 ответ

3
Лучший ответ

Я не уверен, где вы получили формат, но последний фантомный JS не использует обратные вызовы и вместо этого использует обещания. И конструктор (Phantom.create) ожидает конфигураций в виде массива, а не функции обратного вызова.

Ваш код должен быть чем-то похожим на это, я полагаю (я не тестировал это, но должен был работать).

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
    Я не смог получить страницу результатов с вашим решением, я только получил строку «success», но ваш код помог мне показать способ ее решения, используя этот пример в github. К сожалению, я все еще не смог получить динамическое содержимое страницы, и возвращает только статическое содержимое и функции js, но это не является частью этого вопроса. Спасибо!
  • 0
    для оценки страницы следует разрешить обещание, чтобы получить результат (оценка страницы - это метод обещания) page.evaluate(function() { return document.title; }).then(function(title){ console.log("Page Title", title); })

Ещё вопросы

Сообщество Overcoder
Наверх
Меню