【发布时间】:2016-04-14 18:24:51
【问题描述】:
我正在使用 node.js 编写爬虫。首先,我需要获取主页以获取该页面上每个项目的 URL,然后我会爬取每个项目的 URL 以逐个获取它们的详细信息
fetchPage(url)是获取链接的HTML文本
function fetchPage(url){
return new Promise(
(resolve,reject)=>{
agent
.get(url)
.end(function(err,res){
if (err){
reject(err);
} else{
resolve(res.text);
}
});
});
}
这是这个爬虫的全局调用
fetchPage(link).then(
(result)=>{
const urls=getUrls(result);
for (var i=0;i<5;i++){
fetchItem(urls[i].link).then(
(result)=>{
console.log('Done');
},
(error)=>console.log(error)
);
}
},
(error)=>console.log(error)
);
我在获取主页后处理获取所有项目的 URL(通过getUrls)
fetchItem(url) 是另一个Promise,它确保项目的每个HTML 文本在被fetchPage 获取后都应通过getItem 处理
function fetchItem(url){
return new Promise(
(resolve,reject)=>{
fetchPage(url).then(
(result)=>{
getItem(result);
},
(error)=>reject(error)
);
});
}
它确实会爬行。它确实得到了我需要的所有物品,而且没有任何信息不足。
但是我的代码有问题。为什么控制台不为我记录Done 消息?
结果的顺序不正确。爬取结果的顺序和我想象的不一样,和网站上的顺序不一样。
请指出我对这些异步控制有什么误解和做错了什么?如何保证它们的顺序?如何修复此代码以满足?
如果我想在所有项目被完全抓取后记录一条消息All done,并确保它们以正确的顺序完全提取,我该怎么办?
【问题讨论】:
标签: javascript node.js asynchronous promise web-crawler