node.js-使用 async 控制并发(6)

  22 Jun 2017


目标

新建node5项目,代码的入口是 app2.js,当调用 node app2.js 时,它会输出 http://cn.made-in-china.com/nmEJVvWbTxcu-gongsi-1.html 页下的所有公司主页的公司名字,链接,以及负责人以 json 的格式。

注意:与上节课不同,并发连接数需要控制在 5 个。 例如:

[ { comname: '苏州斯特凡电子有限公司',
    url: 'http://stefan128933.cn.made-in-china.com',
    boss: '耿徐 先生' }]

知识点

  1. 学习 async(https://github.com/bsspirit/async_demo) 的使用。这里有个详细的 async demo 演示:https://github.com/bsspirit/async_demo
  2. 学习使用 async 来控制并发连接数。

内容

node4中的代码并不是很完美,我们一次性发出几十个请求,在很多网站会识别为恶意请求从而封掉你的ip

我们在写爬虫的时候,如果有 1000 个链接要去爬,那么不可能同时发出 1000 个并发链接出去对不对?我们需要控制一下并发的数量,比如并发 10 个就好,然后慢慢抓完这 1000 个链接。 用 async 来做这件事很简单。

这次我们要介绍的是 async 的 mapLimit(arr, limit, iterator, callback) 接口。另外,还有个常用的控制并发连接数的接口是 queue(worker, concurrency),大家可以去 https://github.com/bsspirit/async_demo 看看说明。

对了,还有个问题是,什么时候用 eventproxy,什么时候使用 async 呢?它们不都是用来做异步流程控制的吗?

我的答案是:

当你需要去多个源(一般是小于 10 个)汇总数据的时候,用 eventproxy 方便;当你需要用到队列,需要控制并发数,或者你喜欢函数式编程思维时,使用 async。大部分场景是前者,所以我个人大部分时间是用 eventproxy 的。