2015-06-06 57 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參數。