之前使用request+cheerio简单的爬过虾米音乐的一些排行榜,后来一直想用node导出excel文件来方便统计,于是使用node-xlsx尝试了一下。
1. 为什么要导出为excel
使用node的各类处理请求的库,甚至是直接用jsonp, AJAX直接在控制台简单的请求,都能获取到文档内容或者是api返回的结果。但是由于有时候这些爬取操作只是简单的一次性操作,数据并不会存储到本地的数据库里,但是有需要有一定的数据管理系统来对爬取的数据进行处理,所以选择了excel。
2. 依赖
这里用到的依赖主要有:
- request 用于服务端发起请求
- cheerio 服务器端的轻量化jquery,将请求到的文档内容转化为可以操作的DOM对象,对DOM进行节点操作,api与jquery相似
- node-xlsx node-xlsx是对sheetJS的简单封装,可以读取和导出xlsx文件
3. 具体实现
这里主要用一个爬取荆楚网发帖数据的例子进行演示。
主要的思路是,首先登陆荆楚网网站(由于登陆需要输入验证码,而且爬取数据单一,这里直接人工登陆从控制台获取到cookie),这是请求头中的cookie,爬取指定页面内容后存储到本地,利用node-xlsx转存为excel文件。
文件结构
|
|
配置项
|
|
爬取请求
|
|
转存为excel
由于sheetJS/js-xlsx
的写入操作比较繁琐,这里采用node-xlsx
。
使用node-xlsx
写入xlsx文件的方式为
- 调用build方法并传入一个对象options,设置options的data属性为数组Sheet
- 数组Sheet的每项为一个数组Row,对应excel表格的每一行
- 数组Row的每一项对应每一个table cell的内容。
node-xlsx.build()
最终会返回一个buffer对象,用于写入到最终的xlsx文件。
|
|
4. 改进
之后准备该用stream的方式在内存中保存爬取到的数据,爬取结束后然后直接转存为excel。
但是这样也有一个问题是,爬取数据过多会占用大量内存。
所以还是用写入数据库吧……