Cron и кошмар JS
Я пытаюсь запустить cron с кошмаром JS на местном уровне. К сожалению, у меня есть эта ошибка.
Unhandled rejection (<{"message":"navigation error","code":-...>, no stack trace)
Связанная проблема: Nightmare JS не работает
Мне было интересно, связано ли это с тем, что для кошмара требуется графический интерфейс?
Спасибо за вашу помощь,
РЕДАКТИРОВАТЬ
В моем cron у меня есть одна функция Promise, которая состоит из cron, за которой следуют обещания.
var job = new CronJob('* */10 * * * *', function() {
crawl()
}, function () {
console.log("crawl ended")
},
true
);
job.start();
Вот как выглядит этот кошмар:
var Nightmare = require('nightmare');
var nightmare = Nightmare({
typeInterval: 300,
show: true
});
nightmare
.goto('https://pageThatRequireToLoginThenDiplayJsonAsText.com')
.type('[name=email]', '')
.wait(1000)
.type('[name=email]', 'myemail')
.wait(1000)
.type('[name=password]', '')
.wait(1000)
.type('[name=password]', 'mypassword')
.click('[type=submit]')
.wait(25000)
.wait(25000)
.evaluate(function (page, done) {
document.documentElement
done()
})
.end()
.then(function (result) {
// fs.writeFileSync('testOutput.json', JSON.stringify(result));
console.log(JSON.stringify(result))
})
.catch(function (error) {
console.error('failed:', error);
});
Когда я запускаю функцию crawl без cron, она прекрасно работает.
2 ответа
Моя проблема была в настройках cron. Я бы лучше использовал
var job = new CronJob('* 10 * * * *', function() {
crawl()
}, function () {
console.log("crawl ended")
},
true
);
Кроме того, мне пришлось переопределить настройки кошмара в мою функцию.
var get_data = function(){
var Nightmare = require('nightmare');
var nightmare = Nightmare({
typeInterval: 300,
show: true
});
nightmare
.goto('https://pageThatRequireToLoginThenDiplayJsonAsText.com')
.type('[name=email]', '')
.wait(1000)
.type('[name=email]', 'myemail')
.wait(1000)
.type('[name=password]', '')
.wait(1000)
.type('[name=password]', 'mypassword')
.click('[type=submit]')
.wait(25000)
.wait(25000)
.evaluate(function (page, done) {
document.documentElement
done()
})
.end()
.then(function (result) {
// fs.writeFileSync('testOutput.json', JSON.stringify(result));
console.log(JSON.stringify(result))
})
.catch(function (error) {
console.error('failed:', error);
});
}
Вместо
var Nightmare = require('nightmare');
var nightmare = Nightmare({
typeInterval: 300,
show: true
});
var get_data = function(){
nightmare
.goto('https://pageThatRequireToLoginThenDiplayJsonAsText.com')
.type('[name=email]', '')
.wait(1000)
.type('[name=email]', 'myemail')
.wait(1000)
.type('[name=password]', '')
.wait(1000)
.type('[name=password]', 'mypassword')
.click('[type=submit]')
.wait(25000)
.wait(25000)
.evaluate(function (page, done) {
document.documentElement
done()
})
.end()
.then(function (result) {
// fs.writeFileSync('testOutput.json', JSON.stringify(result));
console.log(JSON.stringify(result))
})
.catch(function (error) {
console.error('failed:', error);
});
}
Хорошо, с самого начала я не уверен, прав ли я или нет, потому что у меня не слишком много опыта с этим, и вы не указали, что вы определили в своем кроне. Но из быстрого поиска, который я сделал, то, что вы предполагаете, является правильным. Когда вы используете cron ваши звонки сделаны из командной строки. Теперь Nightmare построен на Electron, который, в свою очередь, зависит от Chromium. Теперь из того, что я узнал здесь, у Electron может быть ошибка, которая вызывает таймаут каждый раз, когда страница мгновенно загружается в реальном браузере хрома. Итак, из того, что я понял, вашему приложению необходимо, чтобы Electron взаимодействовал с Chromium для правильной работы, а в вашем случае это не так. Прошу прощения за расплывчатость и, возможно, неправильно, но это лучшее, что я мог придумать с таким небольшим количеством информации.