【问题标题】:Cron and nightmarejsCron 和 nightmarejs
【发布时间】:2017-03-15 17:34:52
【问题描述】:

我无法使用 nightmarejs 运行我的 cron。

函数 get_data() 的第一次迭代效果很好,但之后 cron 会重新启动,并且不会再次触发该函数。

“抓取结束”也永远不会被记录。

你知道我的代码有什么问题吗?

日志

1
cron
data fetched
2
cron
3
cron

-

var Nightmare = require('nightmare')
var nightmare = Nightmare({
  typeInterval: 300,
  show: true,
  executionTimeout: 120000,
  gotoTimeout: 120000
});
let data = ""

-

var get_data = function(){
  return new Promise(function(resolve, reject) {
    nightmare
    .goto('https://url.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(5000)
    .goto('https://url.com')
    .wait(25000)

    .evaluate(function (page, done) {

      return document.body.innerText
      done()
    })
    .end()
    .then(function (result) {
      data = result
    })
    .then(function(data){
      return fs.writeFile("./data.txt", data, function(err) {
        if(err) {
          console.log(err)
          reject(err)
        }
        resolve(data)
      });
    })
    .catch(function(error){
      reject(error)
    })
  })
}

-

var i = 0
var job = new CronJob('0 */20 * * * *', function() {
    ++i
    console.log(i)
    console.log("cron")
    get_data()
  }, function () {
    console.log("crawl ended")
  },
  true
);

job.start();

【问题讨论】:

    标签: javascript node.js cron nightmare


    【解决方案1】:

    立即跳出来的几件事。

    .evaluate(function (page, done) {
    
          return document.body.innerText
          done()
        })
    

    这不会像您期望的那样做,并且可能永远不会返回并导致超时错误。您没有为page 传递参数,这意味着done 将是未定义的。将以上内容更改为:

    .evaluate(function (done) {
    
          return document.body.innerText
          done()
        })
    

    第二,这个:

    .then(function(data){
          return fs.writeFile("./data.txt", data, function(err) {
            if(err) {
              console.log(err)
              reject(err)
            }
            resolve(data)
          });
        })
    

    ...重新定义data。我不认为你在前面设置了data 变量,我想这应该总是输出undefined。小心你的闭包。

    第三,也许是最重要的:

    .evaluate(function (page, done) {
    
          return document.body.innerText
          done()
        })
        .end() // <== this might be a problem
        .then(function (result) {
          data = result
        })
    

    由于nightmare 仅定义一次,因此您将结束您拥有的唯一实例。如果您尝试在循环的第二次迭代中对已结束的实例执行操作,它将不会被重新创建,并且将无法正常工作。要么取出 .end() 并将其移到脚本的末尾,要么为每次迭代创建一个新的 Nightmare 实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-09
      • 1970-01-01
      • 2017-03-25
      相关资源
      最近更新 更多