Я пытаюсь обрабатывать статьи в Википедии и хочу получать список всех статей в Википедии. Для этого я часто отправляю HTTP-запросы в API Википедии, который позволяет вам получать 500 наименований по времени, а также возвращает строку apcontinue, которая при использовании в следующем запросе возвращает название, начинающееся с этой строки.Отправка нескольких HTTP-запросов в Node.js: получение ответов или тайм-аутов
Для того, чтобы сделать это, я использую 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 запросов, я не получаю ответа, но мой запрос также не истекает.
Любые идеи, почему это происходит?
Update
Запрос Посылаю Википедии содержит следующие параметры:
var params = {
list: 'allpages',
aplimit: limit,
apfrom: from,
continue: cont,
// apfilterredir: 'nonredirects'
};
Интересно, что после выхода из установки nonredirects
, я был в состоянии послать и получить до 330 запросов, но не более того.
Update 2
Я был в состоянии зарегистрировать finished
событие. Похоже, что он запущен и для запроса, который тоже не работает. Я изменил код соответственно.
Извините, это было не ясно. По 500 названий одновременно я имею в виду, что я запрашиваю страницу с 500 заголовками из Википедии одновременно, а не 500 одновременных запросов. – Georg
Можете ли вы показать фактический код, который вы используете для обработки и выполнения запросов? (Я удалил свой старый комментарий, потому что я больше не мог его редактировать, у него была опечатка) – robertklep
Теперь я обновил вопрос, показывая код, используемый для запроса. – Georg