2015-06-06 7 views
2

Я пытаюсь обрабатывать статьи в Википедии и хочу получать список всех статей в Википедии. Для этого я часто отправляю 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 событие. Похоже, что он запущен и для запроса, который тоже не работает. Я изменил код соответственно.

+0

Извините, это было не ясно. По 500 названий одновременно я имею в виду, что я запрашиваю страницу с 500 заголовками из Википедии одновременно, а не 500 одновременных запросов. – Georg

+0

Можете ли вы показать фактический код, который вы используете для обработки и выполнения запросов? (Я удалил свой старый комментарий, потому что я больше не мог его редактировать, у него была опечатка) – robertklep

+0

Теперь я обновил вопрос, показывая код, используемый для запроса. – Georg

ответ

0

Возможно, вам нужен флаг бота, чтобы иметь более высокие пределы API. Возможно, слишком много запросов параллельно; Рекомендация WMF заключается в том, чтобы делать запросы поочередно в случае таких больших задач. Кроме того, вы должны использовать параметр maxlag с низкими значениями в соответствии с Этикетом API WMF.

 Смежные вопросы

  • Нет связанных вопросов^_^