【发布时间】:2012-12-31 08:11:59
【问题描述】:
我有一个 HTTP Get 请求,我想解析响应并将其保存到我的数据库中。
如果我单独调用 crawl(i),我会得到很好的结果。但我必须从 1 到 2000 调用 crawl()。 我得到了很好的结果,但有些响应似乎丢失了,有些响应是重复的。我想我不明白如何调用数千个异步函数。我正在使用async module 队列功能,但到目前为止我仍然缺少一些数据并且仍然有一些重复。我在这里做错了什么?感谢您的帮助。
我的节点功能:
function getOptions(i) {
return {
host: 'magicseaweed.com',
path: '/syndicate/rss/index.php?id='+i+'&unit=uk',
method: 'GET'
}
};
function crawl(i){
var req = http.request(getOptions(i), function(res) {
res.on('data', function (body) {
parseLocation(body);
});
});
req.end();
}
function parseLocation(body){
parser.parseString(body, function(err, result) {
if(result && typeof result.rss != 'undefined') {
var locationTitle = result.rss.channel[0].title;
var locationString = result.rss.channel[0].item[0].link[0];
var location = new Location({
id: locationString.split('/')[2],
name: locationTitle
});
location.save();
}
});
}
N = 2 //# of simultaneous tasks
var q = async.queue(function (task, callback) {
crawl(task.url);
callback();
}, N);
q.drain = function() {
console.log('Crawling done.');
}
for(var i = 0; i < 100; i++){
q.push({url: 'http://magicseaweed.com/syndicate/rss/index.php?id='+i+'&unit=uk'});
}
[编辑] 好吧,经过大量测试后,我正在抓取的服务似乎无法快速处理这么多请求。因为当我按顺序执行每个请求时,我可以获得所有好的响应。
有没有办法减缓异步队列的方法?
【问题讨论】:
-
现在好像很多请求都失败了……我怎样才能保证请求不会失败?
-
您是否尝试使用 setTimeOut 来延迟队列工作函数中的
callback()调用?这样可以减慢队列中任务的执行速度。
标签: node.js loops asynchronous web-crawler