node-crawler 异步 Promise 和 Promise.all 实现
在使用 node-crawler 进行爬虫都是异步的,但项目中往往需要爬虫多个链接,这样异步就不好处理了。
在官方文档中,爬虫多个链接可以传递数组参数,但在文档并没有提供类似Promise.all API, 导致多个爬虫请求异步不好处理, 不能判断所有爬虫请求是否全部完成。
在官网文档中,Promise support 还在 "Rough todolist", 所以打算自己简单实现一个Promise 和 Promise.all, 有需要的可以参考。
var Crawler = require("crawler");
const c = new Crawler({
maxConnections : 10
});
// 所有爬虫链接
const urls = ['https://cn.bing.com/', 'https://cn.bing.com/'];
let promiseList = [];
urls.forEach(v => {
promiseList.push(spiderItem(v));
})
// 使用Promise.all
Promise.all(promiseList).then(ress => {
// 所有爬虫链接爬虫完成时调用
console.log(ress)
})
function spiderItem(url) {
return new Promise((resolve, reject) => {
c.queue([{
uri: url,
jQuery: true,
callback: function (error, res, done) {
if (error) {
reject(error);
} else {
resolve(res)
}
done();
}
}]);
})
}
网友评论