Nodejs中async.mapLimit配合superagent的使用遇到问题

Nodejs中async.mapLimit配合superagent的使用遇到问题

这是我在做一个爬虫时候遇到的问题: 我获取了一组url的数组,并在迭代器中用superagent对当前的url发送请求,我们都知道async.mapLimit中的limit参数是可以控制并发链接数的 ,是不是我控制了iterator的并发数,就相当于控制它其中superagent的请求数。 我是认为iterator每执行一次,superagent就会发送一个请求,等到iterator的callback执行了,才又会并行发起一个链接数,这样就控制了请求的发送数,被我要爬的网站403的概率就会降低。 代码如下: 屏幕快照 2014-11-10 下午9.23.55.png


6 回复

好的,让我们来分析一下你在使用 async.mapLimitsuperagent 进行爬虫开发时遇到的问题。你希望限制并发的请求数量以避免被目标网站封禁。

问题分析

你的主要问题是,虽然你使用了 async.mapLimit 来控制并发请求的数量,但 superagent 的请求可能并没有按照你预期的方式并发执行。这可能是由于你对 async.mapLimit 的工作方式理解有误,或者是在处理 superagent 请求时出现了问题。

示例代码

首先,我们需要确保正确地使用 async.mapLimitsuperagent。以下是一个简单的示例代码,展示如何正确地使用它们:

const async = require('async');
const superagent = require('superagent');

// 假设我们有一个URL数组
const urls = [
    'http://example.com/page1',
    'http://example.com/page2',
    // 更多URL...
];

// 使用async.mapLimit来限制并发请求数量
async.mapLimit(urls, 5, (url, callback) => {
    superagent.get(url)
        .then(response => {
            console.log(`Fetched ${url}: ${response.status}`);
            callback(null, response.body);
        })
        .catch(error => {
            console.error(`Failed to fetch ${url}: ${error.message}`);
            callback(error);
        });
}, (err, results) => {
    if (err) {
        console.error('Error during fetching:', err);
    } else {
        console.log('All requests completed successfully:', results);
    }
});

解释

  1. async.mapLimit(urls, 5, ...): 这里我们使用 async.mapLimit 来限制并发请求的数量为5。这意味着在同一时间最多会有5个请求同时进行。

  2. superagent.get(url): 对每个URL发送一个GET请求。superagent 是一个轻量级的HTTP客户端库。

  3. .then(callback): 如果请求成功,我们将响应体传递给回调函数。如果请求失败,则捕获错误并传递给回调函数。

  4. callback(null, response.body): 在请求成功的情况下,调用回调函数并将响应体作为结果传递。

  5. callback(error): 在请求失败的情况下,调用回调函数并将错误传递给结果。

  6. (err, results) => { ... }: 当所有请求完成后,调用最终的回调函数。如果有任何请求失败,err 将包含错误信息;否则,results 包含所有成功的响应体。

注意事项

  • 确保你已经安装了所需的依赖库:

    npm install async superagent
    
  • 如果你仍然遇到问题,可能需要检查目标网站的反爬虫策略,以及是否需要设置请求头(如 User-Agent)来模拟浏览器行为。

通过这种方式,你可以有效地控制并发请求的数量,从而减少被目标网站封禁的风险。希望这能帮助你解决问题!


你要把async.mapLimit写到superagent.get里面

回调注入吧,Async好像是。。。我写爬虫的时候也是这些,不过现在觉得有了promise generator特别是async和await应该更方便了

是的, 所以问题是什么?

我尝试上面这段代码的时候,为什么情况是,比如你控制的并发数量是2,那执行完两个并发的请求之后,程序就停在那里,没有继续请求剩下的href?

根据你的描述,你在使用 async.mapLimit 控制并发请求时遇到了问题。async.mapLimit 可以限制并发任务的数量,而 superagent 则是一个轻量级的 HTTP 客户端。你需要确保每次调用 superagent 的请求都能正确地被 async.mapLimit 控制。

以下是一个简单的示例代码来展示如何使用 async.mapLimitsuperagent

const async = require('async');
const superagent = require('superagent');

const urls = [
    'http://example.com/page1',
    'http://example.com/page2',
    // 添加更多URL...
];

// 定义处理每个URL的函数
function fetchUrl(url, callback) {
    superagent.get(url)
        .then(response => {
            console.log(`Fetched ${url}`);
            callback(null, response.text);
        })
        .catch(error => {
            console.error(`Error fetching ${url}:`, error.message);
            callback(error);
        });
}

// 使用 async.mapLimit 控制并发请求数量
async.mapLimit(urls, 5, fetchUrl, (err, results) => {
    if (err) {
        console.error('An error occurred:', err);
    } else {
        console.log('All URLs fetched successfully:', results);
    }
});

解释

  1. 导入模块:导入 asyncsuperagent 模块。
  2. 定义 URL 数组:定义一个包含所有需要请求的 URL 的数组。
  3. 定义处理函数:定义一个处理函数 fetchUrl,该函数接收一个 URL 并使用 superagent 发送 GET 请求。如果请求成功,将结果传递给回调函数;如果失败,则传递错误。
  4. 使用 async.mapLimit:调用 async.mapLimit 来控制并发请求的数量(在这个例子中是 5)。当所有请求完成时,回调函数会被调用,你可以在这里处理最终结果或错误。

确保你已经安装了 asyncsuperagent,可以通过以下命令安装它们:

npm install async superagent

通过这种方式,你可以有效地控制并发请求的数量,从而减少被目标网站封禁的风险。

回到顶部