Моя цель - очистить некоторые данные с веб-сайта с помощью 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))
;
Я не уверен, где вы получили формат, но последний фантомный 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();
})
page.evaluate(function() { return document.title; }).then(function(title){ console.log("Page Title", title); })