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

How to make many Node.js requests (using request module)

本文关键字:请求 模块 许多 Node js 何发出      更新时间:2023-09-26

主要目的:我试图使用Node.js从大约10,000个不同的页面上抓取数据。

问题:它非常快地刮过前500~1000,然后变成一只(它变慢的变量),然后最终似乎永远卡住了。

我正在使用 Node 中的 request 模块.js发出请求,然后我使用 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:

447/500
89.4%

超时:5 秒
后未完成任何请求 447 已完成

测试 2:

427/500
85.39999999999999%

超时:5 秒
后未完成任何请求 427

可能会有所帮助的其他详细信息:

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

我同意评论中的@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();