我有一个HTTP Get请求,希望解析响应并将其保存到我的数据库中。
如果我独立调用crawl(i),我可以获得良好的结果。但是我必须从1到2000调用crawl()。我得到了很好的结果,但是有些响应似乎丢失了,而且有些响应是重复的。我不认为我知道如何调用数千个异步函数。我正在使用async模块队列函数,但到目前为止,我仍然缺少一些数据,并且仍然存在一些重复项。我在这里做错了什么?谢谢你的帮助。 我正在爬取的内容 我的节点函数:
如果我独立调用crawl(i),我可以获得良好的结果。但是我必须从1到2000调用crawl()。我得到了很好的结果,但是有些响应似乎丢失了,而且有些响应是重复的。我不认为我知道如何调用数千个异步函数。我正在使用async模块队列函数,但到目前为止,我仍然缺少一些数据,并且仍然存在一些重复项。我在这里做错了什么?谢谢你的帮助。 我正在爬取的内容 我的节点函数:
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'});
}
[编辑] 经过大量测试,似乎我正在爬取的服务无法处理那么快的许多请求。因为当我按顺序执行每个请求时,我可以得到所有良好的响应。
有没有一种方法可以减缓异步队列方法的速度?
callback()
и°ғз”ЁдәҶеҗ—пјҹиҝҷж ·еҸҜд»ҘеҮҸзј“йҳҹеҲ—дёӯд»»еҠЎзҡ„жү§иЎҢйҖҹеәҰгҖӮ - max