最近在做一个网页爬虫,先抓取列表页面,再获取列表页所有内容页的url,然后将所有列表页的url循环调用抓取方法,这样导致抓取的顺序不可控,想知道如何能够控制抓取的顺序。
例如:正在抓取A页面, A页面抓取完毕;正在抓取B页面, B页面抓取完毕...按这样的顺序执行。
抓取函数:
function doRequest (url) {
console.log(chalk.red(`正在抓取 ${url} 的内容...`));
return new Promise ((resolve, reject) => {
request
.post(url)
.set(headers)
.charset('utf-8')
.then(result => {
resolve(result.text);
console.log(chalk.red(`${url} 的内容抓取完毕!`));
})
.catch(err => {
reject(err);
})
});
}
调用
// 请求列表
doRequest('list.html')
.then(content => {
return this.parseList(content); // 得到所有的内容页面地址
})
// 请求内容页
.then(links => {
return Promise.all(links.map(link => {
return doRequest(link);
}))
})
.then (allContent => {
console.log(allContent);
})
执行的结果
reduce 然后一直放在then里
https://segmentfault.com/a/11...
看一下应用里的 同时请求按序处理 这一块吧 应该是你要的效果