主要目的:我尝试使用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。
答案 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();