我正在尝试处理维基百科文章,并希望收到所有维基百科文章的列表。为了做到这一点,我经常向维基百科 API 发送 http 请求,它允许您一次接收 500 个标题并返回一个 apcontinue 字符串,当在以下请求中使用时,返回标题从那个字符串开始。
为了做到这一点,我使用了 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
事件。它似乎也因失败的请求而被解雇。我相应地修改了代码。
最佳答案
也许您需要一个机器人标记来获得更高的 API 限制。也许并行的请求太多了; WMF 建议在这种大任务的情况下连续发出请求。此外,根据 WMF API 礼仪,您应该使用低值的 maxlag 参数。
关于node.js - 在 Node.js 中发送多个 HTTP 请求 : Not receiving any responses or timeouts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30685079/