昨天在爬禅道页面的数据,用到了 cheerio ,觉得不错,这里简单介绍下
cheerio
cheerio 用于在 server 端,解析 Html 模板。语法和 jQuery 差不多,很简单。
可以看下官方的描述:
Fast, flexible & lean implementation of core jQuery designed specifically for the server.
每周将近 200w 的下载量,证明是个不错的包。
Demo
简单说明下怎么用它来解析 HTML 数据
通过 fetch 获取页面 body 数据
1 | var url = '/zentao/bug-browse-10-resolvedByMe-0--205-1000-1.html'; |
使用 cheerio 加载页面数据,使用类似 jq selector 规则进行源数据的获取
1 | var $ = cheerio.load(data.toString()); |
遍历,根据数据位置加工成目标数据,存放于 list 对象中
1 | var list = []; |
list 结果:
1 | [ |
“链式”请求
可能需要更多详细数据,但是这个页面没有提供,需要根据 a 标签再发起请求进行获取。但实际过程会遇到某些问题:
对于上面的 list.href,通过遍历很容易拿到。那怎么在循环里继续发起请求?
可能你会想到:
1 | for(...){ |
如果 list.length 过大,势必会让这样的同步函数执行时间过长,那是不是可以用 promise.all 解决?
1 | var promiseList = []; |
看似很 ok ,其实万万没想到禅道居然还有 并发限制,于是有了如下代码:
1 | // promise function |