我有一个 HTTP Get 请求,我想解析响应并将其保存到我的数据库中。
如果我独立调用 crawl(i),我会得到很好的结果。但是我必须从 1 到 2000 调用 crawl()。我得到了很好的结果,但有些响应似乎丢失了,有些响应是重复的。我不认为我了解如何调用数千个异步函数。我正在使用异步模块队列功能,但到目前为止我仍然缺少一些数据并且仍然有一些重复。我在这里做错了什么?谢谢你的帮助。
我的节点功能:
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'});
}
[编辑] 好吧,经过大量测试后,我正在抓取的服务似乎无法快速处理这么多请求。因为当我按顺序执行每个请求时,我可以获得所有好的响应。
有没有办法减慢异步队列方法?