我在Node中編寫命令行腳本(因爲我知道JS和吸吮Bash +我需要通過DOM導航的jQuery)...現在我正在閱讀輸入文件,我遍歷每一行。我如何在NodeJS的循環內進行HTTP請求
我該如何去做每行一個HTTP請求(GET),以便我可以使用jQuery加載生成的字符串並從每個頁面提取我需要的信息? 我試過使用NPM httpsync
包......所以我可以對每行輸入文件進行一次阻止GET調用,但它不支持HTTPS,當然我只支持HTTPS的服務只支持。
謝謝!
我在Node中編寫命令行腳本(因爲我知道JS和吸吮Bash +我需要通過DOM導航的jQuery)...現在我正在閱讀輸入文件,我遍歷每一行。我如何在NodeJS的循環內進行HTTP請求
我該如何去做每行一個HTTP請求(GET),以便我可以使用jQuery加載生成的字符串並從每個頁面提取我需要的信息? 我試過使用NPM httpsync
包......所以我可以對每行輸入文件進行一次阻止GET調用,但它不支持HTTPS,當然我只支持HTTPS的服務只支持。
謝謝!
我很擔心在不進行某種節制/限制併發連接的數量的情況下發出100萬個併發請求,但看起來Node似乎將我「開箱即用」約束到5-6個併發連接。
這是完美的,因爲它可以讓我的代碼更簡單,同時充分利用節點固有的異步性。
這是[HTTP'代理'](http://nodejs.org/api/http.html#http_class_http_agent)正在做節流(由'http控制.globalAgent.maxSockets',默認爲'5'),但要警告的是,在節點0.12中,不會有默認限制。 – josh3736
處理大量作業的好方法是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' });
// ...
我將最有可能使用異步庫的功能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!');
})
對不起,但爲什麼特別阻塞呼叫.. – Mritunjay
我有點改變了關於阻塞......但阻塞使它很容易不創建大量的請求。我可能會加載1000多行文件,所以如果我不阻止腳本會創建大量的並行請求,不是嗎?節流可以工作,但我不能包裹我的頭ATM – Oli