如何发出许多Node.js请求(使用请求模块)

时间:2016-03-01 12:40:08

标签: javascript node.js web-scraping request

主要目的:我尝试使用Node.js从大约10,000个不同的页面中删除数据。

问题:它快速刮擦前500~1000,然后变成一只乌龟(它变慢的地方),超过它,然后最终似乎永远陷入困境。

我使用Node.js中的request模块发出请求,然后使用cheerio开始抓取,

此代码复制了我的问题:

var request = require('request');

var requestsCalledCounter = 0;
var requestsCompletedCounter = 0;
var MAX_REQUESTS = 500;

var start = function () {
    while (requestsCalledCounter < MAX_REQUESTS) {
        request("http://www.google.com", function (error, response, html) {
            requestsCompletedCounter++;
        });
        requestsCalledCounter++;
    }
};

start();

输出:

测试1:

  

500分之447
  89.4%

     

超时:5秒后没有请求完成
  447完成

测试2:

  

500分之427
  85.39999999999999%

     

超时:5秒后没有请求完成
  427

可能有用的额外详情:

我有一系列我将要抓取的URL,所以我循环遍历它们向数组中的每个URL发出请求。它有大约10,000个URL。

1 个答案:

答案 0 :(得分:0)

我同意@cviejo的评论。您应该使用现有项目。然而,为了增加理解,这里是一个实现,一次只有10个未完成的请求。

var request = require('request');

var requestsCalledCounter = 0;
var requestsCompletedCounter = 0;
var pending = 0;
var MAX_PENDING = 10;
var MAX_REQUESTS = 500;

var doreq = function () {
    request("http://www.google.com", function (error, response, html) {
        requestsCompletedCounter++;
        pending--;
    });
    pending++;
    requestsCalledCounter++;
}

var start = function () {
    while (pending < MAX_PENDING && requestsCalledCounter < MAX_REQUESTS) {
        doreq();
    }
    if (requestsCalledCounter < MAX_REQUESTS) {
        setTimeout(start, 1);
    }
};

start();