Cron 和噩梦 js
Cron and nightmare js
我正在尝试 运行 在本地使用噩梦 js 的 cron。
不幸的是我有这个错误。
Unhandled rejection (<{"message":"navigation error","code":-...>, no stack trace)
相关问题:
我想知道这是否与噩梦需要图形界面有关?
感谢您的帮助,
编辑
在我的 cron 中,我有一个 Promise 函数,它由 cron 和 promises 组成。
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);
});
当我 运行 在没有 cron 的情况下抓取功能时效果很好。
好的,我不确定我是否正确,因为我对此没有太多经验,而且您没有指定您在 cron 中定义的内容。但是通过快速搜索,我做出了你所猜测的是正确的。当您使用 cron 时,您的调用是通过命令行进行的。现在 Nightmare 建立在 Electron 之上,而 Electron 又依赖于 Chromium。现在,根据我的了解 here,Electron 可能有一个错误,每次在真正的 chromium 浏览器上立即加载页面时都会导致超时。因此,从我目前收集到的信息来看,您的应用程序需要 Electron 与 Chromium 通信才能正常工作,而在您的情况下,它似乎并没有这样做。很抱歉含糊不清,可能是错误的,但这是我能想到的最好的信息了。
我的问题出在 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);
});
}
我正在尝试 运行 在本地使用噩梦 js 的 cron。 不幸的是我有这个错误。
Unhandled rejection (<{"message":"navigation error","code":-...>, no stack trace)
相关问题:
我想知道这是否与噩梦需要图形界面有关?
感谢您的帮助,
编辑
在我的 cron 中,我有一个 Promise 函数,它由 cron 和 promises 组成。
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);
});
当我 运行 在没有 cron 的情况下抓取功能时效果很好。
好的,我不确定我是否正确,因为我对此没有太多经验,而且您没有指定您在 cron 中定义的内容。但是通过快速搜索,我做出了你所猜测的是正确的。当您使用 cron 时,您的调用是通过命令行进行的。现在 Nightmare 建立在 Electron 之上,而 Electron 又依赖于 Chromium。现在,根据我的了解 here,Electron 可能有一个错误,每次在真正的 chromium 浏览器上立即加载页面时都会导致超时。因此,从我目前收集到的信息来看,您的应用程序需要 Electron 与 Chromium 通信才能正常工作,而在您的情况下,它似乎并没有这样做。很抱歉含糊不清,可能是错误的,但这是我能想到的最好的信息了。
我的问题出在 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);
});
}