2015-06-06 61 views
2

我正在尝试处理维基百科文章,并且希望收到所有维基百科文章的列表。为了做到这一点,我经常发送http请求到维基百科API,它允许您在时间接收500个标题,并且还返回一个,继续字符串,在以下请求中使用该字符串时,将从该字符串开始返回标题。在Node.js中发送多个HTTP请求:未收到任何响应或超时

为了做到这一点,我使用的是agentkeepalive模块:

var http = require('http'); 
var Agent = require('agentkeepalive'); 

var keepaliveAgent = new Agent({ 
    keepAlive: true, 
    maxSockets: 5, 
    timeout: 5000, 
    keepAliveTimeout: 3000 
}); 

要发送一个HTTP请求到维基百科,我使用下面的代码:

function wikipediaApiCall(params, callback) { 
    var options = { 
    host: 'en.wikipedia.org', 
    path: '/w/api.php?' + createParamString(params), 
    method: 'GET', 
    agent: keepaliveAgent 
    }; 

    var callbackFunc = function(response) { 
    var err; 
    var str = ''; 

    if (('' + response.statusCode).match(/^5\d\d$/)) { 
     err = new Error('Server error'); 
    } 

    //another chunk of data has been recieved, so append it to `str` 
    response.on('data', function (chunk) { 
     str += chunk; 
    }); 

    response.on('error', function (e) { 
     err = new Error('Request error'); 
    }); 

    response.on('timeout', function() { 
     err = new Error('Timeout'); 
     response.abort(); 
     callback(err); 
    }); 

    response.on('end', function() { 
     var obj = JSON.parse(str); 

     if (obj.warnings) { 
     err = new Error('Request error'); 
     } 

     callback(err, obj); 
    }); 
    } 

    var req = http.request(options, callbackFunc); 
    req.setTimeout(5000); 

    req.on('error', function(err) { 
    callback(err, null); 
    return; 
    }); 

    req.on('timeout', function() { 
    err = new Error('Timeout'); 
    response.abort(); 
    callback(err); 
    }); 

    req.on('finish', function(){ 
    console.log('ended'); 
    }); 

    req.end(); 
} 

然而,后发送16到20个请求,我没有收到任何回应,但我的请求也没有超时。

任何想法为什么会发生这种情况?

更新

我送维基百科请求包含以下参数:

var params = { 
    list: 'allpages', 
    aplimit: limit, 
    apfrom: from, 
    continue: cont, 
    // apfilterredir: 'nonredirects' 
    }; 

有趣的是,离开了nonredirects设置后,我就能够发送和接收多达330个要求,但没有比这更多。

更新2

我可以注册一个finished事件。它似乎也被解雇的请求也失败了。我相应地修改了代码。

+0

对不起,这不清楚。每次以500个标题出版,我的意思是我一次请求一个包含500个来自维基百科的标题的页面,而不是500个并发请求。 – Georg

+0

您可以显示您用于处理和执行请求的实际代码吗? (我删除了我的旧评论,因为我不能再编辑它,它有一个错字) – robertklep

+0

我现在更新了问题,显示了用于请求的代码。 – Georg

回答

0

也许你需要一个bot标志来具有更高的API限制。也许有太多的请求并行; WMF的建议是在这样大的任务的情况下连续发出请求。此外,您应该使用每个WMF API礼仪的低值maxlag参数。