2014-07-12 53 views
1

我在Node中編寫命令行腳本(因爲我知道JS和吸吮Bash +我需要通過DOM導航的jQuery)...現在我正在閱讀輸入文件,我遍歷每一行。我如何在NodeJS的循環內進行HTTP請求

我該如何去做每行一個HTTP請求(GET),以便我可以使用jQuery加載生成的字符串並從每個頁面提取我需要的信息? 我試過使用NPM httpsync包......所以我可以對每行輸入文件進行一次阻止GET調用,但它不支持HTTPS,當然我只支持HTTPS的服務只支持

謝謝!

+0

對不起,但爲什麼特別阻塞呼叫.. – Mritunjay

+0

我有點改變了關於阻塞......但阻塞使它很容易不創建大量的請求。我可能會加載1000多行文件,所以如果我不阻止腳本會創建大量的並行請求,不是嗎?節流可以工作,但我不能包裹我的頭ATM – Oli

回答

0

我很擔心在不進行某種節制/限制併發連接的數量的情況下發出100萬個併發請求,但看起來Node似乎將我「開箱即用」約束到5-6個併發連接。

這是完美的,因爲它可以讓我的代碼更簡單,同時充分利用節點固有的異步性。

+0

這是[HTTP'代理'](http://nodejs.org/api/http.html#http_class_http_agent)正在做節流(由'http控制.globalAgent.maxSockets',默認爲'5'),但要警告的是,在節點0.12中,不會有默認限制。 – josh3736

5

處理大量作業的好方法是async queue

我也建議你看看request做HTTP請求和cheerio處理你得到的HTML。

把這些在一起,你喜歡的東西:

var q = async.queue(function (task, done) { 
    request(task.url, function(err, res, body) { 
     if (err) return done(err); 
     if (res.statusCode != 200) return done(res.statusCode); 

     var $ = cheerio.load(body); 
     // ... 
     done(); 
    }); 
}, 5); 

然後所有網址添加到隊列:

q.push({ url: 'https://www.example.com/some/url' }); 
// ... 
+0

請求和cheerio正是我最終使用,實際上:) – Oli

+0

另外,爲什麼異步隊列比請求+你提到的配置作爲我的回覆評論更好? – Oli

1

我將最有可能使用異步庫的功能eachLimit功能。這將允許您限制活動連接的數量以及在完成所有操作時獲得回調。

async.eachLimit(urls, function(url, done) { 
    request(url, function(err, res, body) { 
     // do something 
     done(); 
    }); 
}, 5, function(err) { 
    // do something 
    console.log('all done!'); 
})