模仿噩梦并传递梦魇的例子

时间:2017-10-24 07:31:58

标签: javascript asynchronous web-scraping yield nightmare

我试图从网站中提取数据,我想在10分钟之后循环,看看数据是否已经改变。我认为在模块中包装我的功能是一个好主意,但现在我陷入困境,让我当前的梦魇实例从登录模块到数据模块。

start.js

var config = require('./config.json');
var login = require('./functions/login.js');
var data = require('./functions/data.js');
var vo = require('vo');

var Nightmare = require('nightmare'),
 nightmare = new Nightmare({
    show: config.nightmare.show,
    typeInterval: config.nightmare.typeInterval,
    webPreferences: {
      images: config.nightmare.images,
    }
  });

vo(login.login)(nightmare, function (err, result) {
  if (!result) return;
  console.log('Logged in as ' + config.user.username)
  vo(data.getData)(nightmare, function (err, result) {
    console.log(result);
  })  
})

login.js

var config = require('../config.json');
var Nightmare = require('nightmare')

function* login(nightmare) {
    return yield nightmare
        .goto('http://example.com/')
        .click('.gogo').wait(2500)
        .insert('.whsOnd', config.user.username)
        .click('.RveJvd').wait(2500)
        .insert('.whsOnd', config.user.password)
        .click('.RveJvd').wait(4000)
        .then(() => {
            return true;
        })        
}
//login works 

module.exports = {
    login: login
}

data.js

var config = require('../config.json');
var Nightmare = require('nightmare')

function* getData(nightmare) {
    console.log('Getting data ...' + nightmare)
    return yield nightmare        
        .click('.index_menu').wait(1000)
        .evaluate(()=>{
          // do stuff
        })                       
        .then((result) => {
            return result;
        })
        .catch((error) => {
            console.log('Failure: ' + error)
        })
}

module.exports = {
    getData: getData
}

我的评估函数正在工作唯一的问题是,即使在data.js中没有未完成的噩梦,例如路径是。

1 个答案:

答案 0 :(得分:0)

您创建了单独的恶梦实例。他们不共享相同的cookie会话,因此您的登录会话不会反映在getdata实例中。您可以尝试从登录实例传递cookie并将其设置在getdata实例中。

login.js

         nightmare
            .goto('http://example.com/')
            .click('.gogo').wait(2500)
            .insert('.whsOnd', config.user.username)
            .click('.RveJvd').wait(2500)
            .insert('.whsOnd', config.user.password)
            .click('.RveJvd').wait(4000)
            .cookies.get()
            .then((cookie) => {
                return cookie; // pass this cookie to getdata
            })    

data.js

nightmare 
   .cookies.set(cookies) //set cookies from login session
   .click('.index_menu').wait(1000)
   .evaluate(()=>{
              // do stuff
            })                       
    .then((result) => {
             return result;
          })
    .catch((error) => {
          console.log('Failure: ' + error)
          })
    }