用node.js写一个简单爬虫,并将数据导出为 excel 文件
2017-04-06 16:56
761 查看
引子
最近折腾node,最开始像无头苍蝇一样到处找资料,然而多数没什么卵用,都在瞎比比。在一阵瞎搞后,我来分享一下初步学习node的三个过程:
1 撸一遍NODE入门,对其有个基本的了解;
2 撸一遍cnode.js社区管理员写的包教不包会node课程,内容量相对于 NODE入门多了很多,特别是这个可能更注重实际项目的构建方式。
3 通读一遍朴灵的《node.js深入浅出》,配合着api一起看(还在继续..药不能停)。
尽看书总是有一种茫然不知所措的感觉,就像手中有一把锋利的钢刀,却不知该如何挥舞。之前学python写了一个爬虫脚本(已经忘得差不多了),那么用牛逼的node肯定也不在话下。于是,花了一个下午,爬取了安居客武汉站的新房数据,亮点是把爬取到的数据通过excel导出来,方便查看。如果哪天有空,可以用echart 做成漂亮的图表,应该是一个good idea。
功能实现简述
功能其实很简单,通过 superagent 模块模拟浏览器向服务器发送请求,利用 cheerio 模块将获得的响应数据转化为我们熟悉的 html ,并且能用如 jQuery 般的使用选择器获取我们想要的数据,最后通过 node-xlsx 模块将数据导出为 excel 文件。是不是很简单呢?
遇到的小坑
1、 node 内建的http 模块,使用http.get(url,cb)方法只能获取静态文件,而多数网站的内容是动态加载的,这就意味着根本获取不到内容啊!!!我真的是一行一行的debug 才反应过来,word天,真是人笨不能怨天。最后通过 superagent 解决了。
2、 通过cheerio.load(html)后,数据们都乖乖的等着我们使用jQuery的方式来获取,我傻逼的独特之处在于,使用$.each(function(i,e){})方法,在内部用$(this)死活拿不到节点,很焦躁啊朋友们。于是又翻了一下API,原来e 是一个dom节点,还得这样用$(e)。你们说我傻逼不?
3、 fs.writeFile 和 fs.createwriteFile ,我还没太明白他们之间的关联,反正第二个方式在本案例中没有用,and 关于什么时候使用同步方法什么时候使用异步方法,谁能告诉我?
截止目前为止,武汉新房的信息总共有 1177 条。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/20/1da5ef4c6f0874b0a751104d54bae484.png)
最后吐槽一句,特么武汉房价涨得真特么快,握草!
最近折腾node,最开始像无头苍蝇一样到处找资料,然而多数没什么卵用,都在瞎比比。在一阵瞎搞后,我来分享一下初步学习node的三个过程:
1 撸一遍NODE入门,对其有个基本的了解;
2 撸一遍cnode.js社区管理员写的包教不包会node课程,内容量相对于 NODE入门多了很多,特别是这个可能更注重实际项目的构建方式。
3 通读一遍朴灵的《node.js深入浅出》,配合着api一起看(还在继续..药不能停)。
尽看书总是有一种茫然不知所措的感觉,就像手中有一把锋利的钢刀,却不知该如何挥舞。之前学python写了一个爬虫脚本(已经忘得差不多了),那么用牛逼的node肯定也不在话下。于是,花了一个下午,爬取了安居客武汉站的新房数据,亮点是把爬取到的数据通过excel导出来,方便查看。如果哪天有空,可以用echart 做成漂亮的图表,应该是一个good idea。
功能实现简述
功能其实很简单,通过 superagent 模块模拟浏览器向服务器发送请求,利用 cheerio 模块将获得的响应数据转化为我们熟悉的 html ,并且能用如 jQuery 般的使用选择器获取我们想要的数据,最后通过 node-xlsx 模块将数据导出为 excel 文件。是不是很简单呢?
遇到的小坑
1、 node 内建的http 模块,使用http.get(url,cb)方法只能获取静态文件,而多数网站的内容是动态加载的,这就意味着根本获取不到内容啊!!!我真的是一行一行的debug 才反应过来,word天,真是人笨不能怨天。最后通过 superagent 解决了。
2、 通过cheerio.load(html)后,数据们都乖乖的等着我们使用jQuery的方式来获取,我傻逼的独特之处在于,使用$.each(function(i,e){})方法,在内部用$(this)死活拿不到节点,很焦躁啊朋友们。于是又翻了一下API,原来e 是一个dom节点,还得这样用$(e)。你们说我傻逼不?
3、 fs.writeFile 和 fs.createwriteFile ,我还没太明白他们之间的关联,反正第二个方式在本案例中没有用,and 关于什么时候使用同步方法什么时候使用异步方法,谁能告诉我?
const http = require('http'), fs = require('fs'), cheerio = require('cheerio'), request = require('superagent'), xlsx = require('node-xlsx'), url = 'http://wh.fang.anjuke.com/loupan/all/p'; let page = 1, list = [], start = '', fetchPage = ()=> { start(); }; start = ()=> { request.get(url + page +'/') .end((err, res)=> { if (!err) { // 如果获取过程中没有发生错误 let html = res.text, // 获取到数据 $ = cheerio.load(html, {decodeEntities: false}), // 加载获取到的 html 数据 $itemMod = $('.key-list').find('.item-mod'), len = $itemMod.length; if(len > 0) { page ++; $itemMod.each((i, e)=> { let data = [], // 用来存储抓取的数据 $e = $(e); // 缓存 data.push($e.find('.items-name').text().trim()); data.push($e.find('.status-icon').text().trim()); data.push($e.find('.address').text().trim().replace(/( )*|(.*/g, '').split('(')[0]); data.push($e.find('.price').text().trim()); data.push($e.find('.tel').text().trim()); data.push($e.find('.address').next('p').find('a').text().trim()); data.push($e.find('.pic>img').attr('src')); list.push(data); }); console.log(list.length); // 通过 xlsx 模块将数据转化成 buffer 对象 let buf = xlsx.build([{name: 'hhh'}, {data: list}]); // 将 buffer 写入到 my.xlsx 中(导出) fs.writeFile('my.xlsx', buf, (err)=> { if(err) throw err; console.log('File is saved!'); // 回调获取下一页数据 start(); }); } } else { console.log('Get data error !'); } }); }; fetchPage();
截止目前为止,武汉新房的信息总共有 1177 条。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/20/1da5ef4c6f0874b0a751104d54bae484.png)
最后吐槽一句,特么武汉房价涨得真特么快,握草!
相关文章推荐
- 一个绝对很好的将DataTable中的数据导出到Excel文件中的类源代码
- 一个简单的导出EXCEL文件的程序
- 【3】node.js-eCharts柱状图-加载本地Excel文件数据
- node.js做的一个简单爬虫,适合菜鸟级新手,针对无防爬措施的网站
- 关于Excel操作编写的一个软件设计构思案例[连载] --如何把处理好后的数据导出Excel文件中(含背景\字体颜色设置)
- 在网看到了一个Silverlight导出DataGrid里的数据到Excel或xml文件里
- POI导出大量数据的简单解决方案(附源码)-Java-POI导出大量数据,导出Excel文件,压缩ZIP(转载自iteye.com)
- c# .Net :Excel NPOI导入导出操作教程之数据库表信息数据导出到一个Excel文件并写到磁盘示例分享
- MySQL数据表简单的导出excel和导入文件
- nodejs EXCEL文件数据转json
- 在网看到了一个Silverlight导出DataGrid里的数据到Excel或xml文件里
- VB6数据导出到Excel文件,一种设计界面查询条件的方法,一种简单加密方法(改写)
- java简单实现爬虫、jsoup实现网页抓取、POI实现数据导出Excel
- js table数据导出excel文件
- ASP.NET将数据导出到一个EXCEL文件的多个SHEET中
- 导出数据到一个Excel文件中去
- 【深入浅出Node.js系列十】一个简单的静态文件合并服务器
- c# .Net :Excel NPOI导入导出操作教程之List集合的数据写到一个Excel文件并导出
- 有趣的Node爬虫,数据导出成Excel
- 将DATAGRID的数据导出为一个标准EXCEL格式的文件