如何发出许多 Node.js 请求(使用请求模块)
How to make many Node.js requests (using request module)
主要目的:我试图使用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();
相关文章:
- NodeJS请求模块-http上的body.IncomingMessage
- 使用节点请求模块的 UTF8 字符编码
- Node.js:无法使用请求模块进行PROFIND
- 错误:在 get 中结束 - 节点后请求(模块)管道后请求后写入
- 无法通过请求模块抓取数据 - Fobidden
- 使用 NodeJS 的请求模块进行 HTTP 身份验证,返回未定义的正文
- 如何发出许多 Node.js 请求(使用请求模块)
- 节点.JS请求模块回调未触发
- GiantBomb API 请求获取 HTML 而不是 JSON,Nodejs 请求模块
- 无法使用节点请求模块进行基本的 HTTP 身份验证
- 无法使用请求模块处理 url
- 从请求模块接收的正文是否包含计算的 css
- 带有有效负载的Firefox插件sdk请求模块POST方法
- 使用请求模块nodejs下载文件时需要filename
- 无法使用Python和请求模块从.aspx登录页获得所需的响应
- 错误:使用mode.js的请求模块读取ECONNRESET
- 带有node.js请求模块的多个请求池
- 代理选项不工作在请求模块的nodejs
- 节点请求模块Http.IncomingMessage没有发出事件
- 我该如何回应呢?在请求模块中写入