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

Javascript 如何发出多个Node.js请求(使用请求模块),javascript,node.js,web-scraping,request,Javascript,Node.js,Web Scraping,Request,主要目的:我正在尝试使用Node.js从大约10000个不同页面中提取数据 问题:它以非常快的速度通过前500~1000个,然后变成一只乌龟(它的速度变慢了),然后最终似乎永远卡在那里 我使用Node.js中的request模块发出请求,然后使用cheerio开始抓取 此代码复制了我的问题: var request = require('request'); var requestsCalledCounter = 0; var requestsCompletedCounter = 0; var

主要目的:我正在尝试使用Node.js从大约10000个不同页面中提取数据

问题:它以非常快的速度通过前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();
var request=require('request');
var requestsCalledCounter=0;
var requestsCompletedCounter=0;
var MAX_请求=500;
var start=函数(){
while(requestsCalledCounter<最大请求数){
请求(“http://www.google.com,函数(错误、响应、html){
requestsCompletedCounter++;
});
requestScaledCounter++;
}
};
start();
输出:

测试1:

447/500
89.4%

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

测试2:

427/500
85.3999999999%

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

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


我有一个我要刮取的URL数组,所以我通过它们循环,向数组中的每个URL发出请求。它有大约10000个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();
var request=require('request');
var requestsCalledCounter=0;
var requestsCompletedCounter=0;
var待定=0;
var MAX_PENDING=10;
var MAX_请求=500;
var doreq=函数(){
请求(“http://www.google.com,函数(错误、响应、html){
requestsCompletedCounter++;
待定--;
});
挂起++;
requestScaledCounter++;
}
var start=函数(){
while(挂起
难怪,您同时发出所有请求,这是预期的行为。
请求
模块不会为您调度它们。尝试在继续之前等待请求完成。我如何等待@CViejot这是一个更广泛的问题,如何处理异步代码。您可以使用多种模式,使用promises/Generator、LIB(如or)等。最简单的形式应用于您的代码:使
while
围绕请求循环一个
if
语句并调用
start()递归地从请求回调也我相信已经有几个节点项目为您处理了这个场景,您可能想看看其中的一个-不过不要问我链接:)