噩梦正在发挥作用,当然我正在测试这个工具但是,主要的问题是为什么我的函数不是无限循环?因为我没有成为页面的条件。我可以做错了吗?
我想要的情况是:无论何时加载页面,我都会得到页面,然后再次调用该函数到下一页直到最后一页。
我也没有成功尝试过setTimeout。谁能帮我?谢谢你提前。
我的控制台日志只打印1然后完成。
代码段在这里: -
var pagn = 1;
function ab(page){
nightmare.goto(url_base+"&page="+page)
.evaluate(() => {
return document.title;
})
.end()
.then((title) => {
console.log(title + ":" + page);
ab(++pagn);
//setTimeout("page(" + page + ")", 5000);
}).catch(()=>{console.log("Error");});
}
ab(pagn);
答案 0 :(得分:0)
如果nightmare.goto()抛出拒绝怎么办?你应该实现catch()
page++
没有将递增的值作为其后增量运算符传递。 page + 1
或++page
应该做一些技巧。
var page = 1;
function ab(page){
nightmare.goto(url_base+"&page="+page)
.evaluate(() => {
return document.title;
})
.end()
.then((title) => {
console.log(title + ":" + page);
ab(page+1);
//setTimeout("page(" + page + ")", 5000);
}).catch(error => {
console.error('Search failed:', error)
ab(page);
});
}
ab(page);
答案 1 :(得分:0)
在定义全局变量时不应传递页面变量,否则每次都会被覆盖..
var page = 1;
function ab(){
nightmare.goto(url_base+"&page="+page)
.evaluate(() => {
return document.title;
})
.end()
.then((title) => {
console.log(title + ":" + page);
ab(page++);
//setTimeout("page(" + page + ")", 5000);
});
}
ab();
答案 2 :(得分:0)
问题是,您正在使用.end()
语句结束nightmare会话,该语句会停止恶梦引擎,因此节点在运行剩余的.then
语句后退出。
为了测试你的代码,我重写了你的功能,以便它刮擦一个特定的网站,并在它多次找到同一个页面时退出(这是我的测试场景,所以你可能必须为你的代码)
const Nightmare = require('nightmare')
const nightmare = Nightmare({ show: true })
function scrapePages( targetUrl, curPage = 0, transform = (url, page) => `${url}?page=${page}`, pageSet = new Set() ) {
console.info('Trying to scrape page ' + transform( targetUrl, curPage ) );
return nightmare
.goto( transform( targetUrl, curPage ) )
.evaluate( () => document.title )
.then( (title) => {
if (pageSet.has( title )) {
throw 'page already exists';
}
pageSet.add( title );
console.info( title + ':' + curPage );
return scrapePages( targetUrl, curPage + 1, transform, pageSet );
})
.catch( ( err ) => {
console.error( err );
return { maxPages: curPage, pages: pageSet };
} );
}
scrapePages( 'some-paged-url', 0, (url, page) => url + '/' + (page + 1) )
.then( ({ maxPages, pages }) => {
// end nightmare process
nightmare.end().then( () => {
console.info(`Found ${maxPages} pages`);
});
} )
.catch( err => console.error('Error occured', err ) );
正如您所看到的,最大的区别在于噩梦过程的结束仅在刮擦过程中发生。那时,您将拥有可用的总页数和成功调用的所有页面