如何在 nightmare.js 中有多个评估方法 运行?
How to have multiple evaluate methods run in nightmare.js?
我正在使用 nightmare.js 抓取网页内容。
验证噩梦实例后,我循环遍历多个页面(需要登录),然后调用执行所有页面加载的 运行 方法。
我想从每个页面获取特定内容,因此我调用了评估函数,以确保我们在浏览器范围内执行。从求值函数中 return 得到的任何内容都会成为 运行 方法
中的参数
但我正在尝试 运行 多次评估函数(每页一次)。但是evaluate函数只能return输出一次给运行方法。我尝试将内容推送到全局变量(在主范围内),但无法从浏览器范围内访问它。
任何人都可以建议如何在一个噩梦实例上使用多种评估方法 运行 并从每个方法中提取信息吗?
var Nightmare = require("nightmare");
//Creates the authenticated nightmare instance
var scraper = new Nightmare()
.goto('https://www.example.com/signin')
.type('#login', 'username')
.type('#password', 'password')
.click('#btn')
.run(function(err, nightmare) {
if (err) {
console.log(err);
}
console.log('Done.');
});
for (var i = 0; i < 4; i++) {
scraper
.goto('https://www.example.com/page'+i)
.wait(1000)
.evaluate(function(){
return $('#result > h3').text()
})
}
scraper.run(function(err, result) {
console.log(result)
if (err) {
console.log(err);
}
}); )
我对噩梦的具体了解不多,但看起来你可能只是简单地遇到了异步问题,这在 js 中通常是一个难题。
好消息是您只需重构代码并依靠生成器使其工作起来相当简单。
实现的关键是,当你在函数名前使用 *
时,该函数就变成了一个生成器函数,它允许你使用 yield
关键字。每当您 yield
该行代码将等待 returned 承诺完成,然后再转到下一行代码,它会 return 结果产生值。您可以使用 vo 库将生成器函数转换为回调,return 是所有生成结果的数组。
var Nightmare = require('../nightmare')
var vo = require('vo')
vo(run)(function(err, result) {
if (err) throw err
console.log('#result > h3: ', result)
})
function *run() {
var nightmare = Nightmare();
yield nightmare
.goto('https://www.example.com/signin')
.type('#login', 'username')
.type('#password', 'password')
.click('#btn')
for (var i = 0; i < 4; i++) {
yield nightmare
.goto('https://www.example.com/page'+i)
.wait(1000)
.evaluate(function(){
return $('#result > h3').text()
})
}
yield nightmare.end()
}
我正在使用 nightmare.js 抓取网页内容。
验证噩梦实例后,我循环遍历多个页面(需要登录),然后调用执行所有页面加载的 运行 方法。
我想从每个页面获取特定内容,因此我调用了评估函数,以确保我们在浏览器范围内执行。从求值函数中 return 得到的任何内容都会成为 运行 方法
中的参数但我正在尝试 运行 多次评估函数(每页一次)。但是evaluate函数只能return输出一次给运行方法。我尝试将内容推送到全局变量(在主范围内),但无法从浏览器范围内访问它。
任何人都可以建议如何在一个噩梦实例上使用多种评估方法 运行 并从每个方法中提取信息吗?
var Nightmare = require("nightmare");
//Creates the authenticated nightmare instance
var scraper = new Nightmare()
.goto('https://www.example.com/signin')
.type('#login', 'username')
.type('#password', 'password')
.click('#btn')
.run(function(err, nightmare) {
if (err) {
console.log(err);
}
console.log('Done.');
});
for (var i = 0; i < 4; i++) {
scraper
.goto('https://www.example.com/page'+i)
.wait(1000)
.evaluate(function(){
return $('#result > h3').text()
})
}
scraper.run(function(err, result) {
console.log(result)
if (err) {
console.log(err);
}
}); )
我对噩梦的具体了解不多,但看起来你可能只是简单地遇到了异步问题,这在 js 中通常是一个难题。
好消息是您只需重构代码并依靠生成器使其工作起来相当简单。
实现的关键是,当你在函数名前使用 *
时,该函数就变成了一个生成器函数,它允许你使用 yield
关键字。每当您 yield
该行代码将等待 returned 承诺完成,然后再转到下一行代码,它会 return 结果产生值。您可以使用 vo 库将生成器函数转换为回调,return 是所有生成结果的数组。
var Nightmare = require('../nightmare')
var vo = require('vo')
vo(run)(function(err, result) {
if (err) throw err
console.log('#result > h3: ', result)
})
function *run() {
var nightmare = Nightmare();
yield nightmare
.goto('https://www.example.com/signin')
.type('#login', 'username')
.type('#password', 'password')
.click('#btn')
for (var i = 0; i < 4; i++) {
yield nightmare
.goto('https://www.example.com/page'+i)
.wait(1000)
.evaluate(function(){
return $('#result > h3').text()
})
}
yield nightmare.end()
}