准备工作
1. 安装 node.js 开发环境: http://www.runoob.com/nodejs/nodejs-install-setup.html
2. 了解 cheerio 库
英文: https://github.com/cheeriojs/cheerio
中文: https://cnodejs.org/topic/5203a71844e76d216a727d2e
3. 将目录切换到工程目录下, 使用如下命令安装 cheerio
npm install cheerio
Cheerio 安装完成后, 可以进行网页数据抓取.
这里以抓取自如友家 http://www.ziroom.com/ 主页上轮播图为例.
首先分析一下轮播图源代码 (打开自如友家的首页, 按下 F12, 即可找到相应的源码), 如下:
- <ul id="fouCSSlideList">
- <li>
- <a href="http://www.ziroom.com/zhuanti/2017/haiyan/pc/index.html" target="_blank"><img src="http://www.ziroom.com/static/ziroom_2016/images/none.png" _src="http://pic.ziroom.com/static/upload/cms/2017/06/b788435fb909da1a76642e0adf6f6909.jpg" alt="北京租房, 北京白领公寓合租 | 出租, 100% 实景拍摄 [自如网]"></a>
- </li>
- <li>
- <a href="http://zhuanti.ziroom.com/zhuanti/2017/nanjing/kc/index.html" target="_blank"><img src="http://www.ziroom.com/static/ziroom_2016/images/none.png" _src="http://pic.ziroom.com/static/upload/cms/2017/06/9018bf2d9172bf1d8ce97596d33b9586.png" alt="北京租房, 北京白领公寓合租 | 出租, 100% 实景拍摄 [自如网]"></a>
- </li>
- <li>
- <a href="http://zhuanti.ziroom.com/zhuanti/2017/zrk/zrbaitiao/index.html" target="_blank"><img src="http://www.ziroom.com/static/ziroom_2016/images/none.png" _src="http://pic.ziroom.com/static/upload/cms/2017/04/b10f346f36e7bdf88c4227e0240e3fda.jpg" alt="北京租房, 北京白领公寓合租 | 出租, 100% 实景拍摄 [自如网]"></a>
- </li>
- <li>
- <a href="http://zhuanti.ziroom.com/zhuanti/2017/haiyan/meetingReview/index.html" target="_blank"><img src="http://www.ziroom.com/static/ziroom_2016/images/none.png" _src="http://pic.ziroom.com/static/upload/cms/2017/06/fc1fe40b08a9ae3bf6aa258b16eb7ba5.png" alt="北京租房, 北京白领公寓合租 | 出租, 100% 实景拍摄 [自如网]"></a>
- </li>
- <li>
- <a href="http://zhuanti.ziroom.com/zhuanti/2017/zry/yuezu/index.html" target="_blank"><img src="http://www.ziroom.com/static/ziroom_2016/images/none.png" _src="http://pic.ziroom.com/static/upload/cms/2017/05/cfa8a415fd40dde14062b999c8153eac.jpg" alt="北京租房, 北京白领公寓合租 | 出租, 100% 实景拍摄 [自如网]"></a>
- </li>
- <li>
- <a href="http://www.ziroom.com/zhuanti/2017/yezhu/zhizu/m/index.html" target="_blank"><img src="http://www.ziroom.com/static/ziroom_2016/images/none.png" _src="http://pic.ziroom.com/static/upload/cms/2017/03/ea1f3b6d6e80c7cc4ad1434639f401f7.jpg" alt="北京租房, 北京白领公寓合租 | 出租, 100% 实景拍摄 [自如网]"></a>
- </li>
- <li>
- <a href="http://www.ziroom.com/z/nl/duanzu/kl.html" target="_blank"><img src="http://www.ziroom.com/static/ziroom_2016/images/none.png" _src="http://pic.ziroom.com/static/upload/cms/2017/04/9b49a02a370b624fe49e3d39a6213998.jpg" alt="北京租房, 北京白领公寓合租 | 出租, 100% 实景拍摄 [自如网]"></a>
- </li>
- </ul>
我们需要获取的信息主要是 < li > 标签中子标签 < a > 的 href 属性值, 以及子标签 < img > 的_src 和 alt 属性值. 明确要获取的数据就动手吧.
创建 crawler.js 文件, 具体代码如下:
- // 加载 http 模块
- var http = require('http');
- // Cheerio 是一个 Node.js 的库, 它可以从 html 的片断中构建 DOM 结构, 然后提供像 jquery 一样的 css 选择器查询
- var cheerio = require('cheerio');
- // 定义网络爬虫的目标地址: 自如友家的主页
- var url = 'http://www.ziroom.com/';
- http.get(url, function(res) {
- var html = '';
- // 获取页面数据
- res.on('data', function(data) {
- html += data;
- });
- // 数据获取结束
- res.on('end', function() {
- // 通过过滤页面信息获取实际需求的轮播图信息
- var slideListData = filterSlideList(html);
- // 打印信息
- printInfo(slideListData);
- });
- }).on('error', function() {
- console.log('获取数据出错!');
- });
- /* 过滤页面信息 */
- function filterSlideList(html) {
- if (html) {
- // 沿用 JQuery 风格, 定义 $
- var $ = cheerio.load(html);
- // 根据 id 获取轮播图列表信息
- var slideList = $('#foucsSlideList');
- // 轮播图数据
- var slideListData = [];
- /* 轮播图列表信息遍历 */
- slideList.find('li').each(function(item) {
- var pic = $(this);
- // 找到 a 标签并获取 href 属性
- var pic_href = pic.find('a').attr('href');
- // 找到 a 标签的子标签 img 并获取_src
- var pic_src = pic.find('a').children('img').attr('_src');
- // 找到 a 标签的子标签 img 并获取 alt
- var pic_message = pic.find('a').children('img').attr('alt');
- // 向数组插入数据
- slideListData.push({
- pic_href : pic_href,
- pic_message : pic_message,
- pic_src : pic_src
- });
- });
- // 返回轮播图列表信息
- return slideListData;
- } else {
- console.log('无数据传入!');
- }
- }
- /* 打印信息 */
- function printInfo(slideListData) {
- // 计数
- var count = 0;
- // 遍历信息列表
- slideListData.forEach(function(item) {
- // 获取图片
- var pic_src = item.pic_src;
- // 获取图片对应的链接地址
- var pic_href = item.pic_href;
- // 获取图片信息
- var pic_message = item.pic_message;
- // 打印信息
- console.log('第' + (++count) + '个轮播图');
- console.log(pic_message);
- console.log(pic_href);
- console.log(pic_src);
- console.log('\n');
- });
- }
代码写完后, 运行命令行
node crawler.js
结果如下 (网站会更新, 所以数据会有变化):
第 1 个轮播图
北京租房, 北京白领公寓合租 | 出租, 100% 实景拍摄 [自如网]
- http://www.ziroom.com/zhuanti/2017/haiyan/pc/index.html
- http://pic.ziroom.com/static/upload/cms/2017/06/b788435fb909da1a76642e0adf6f6909.jpg
第 2 个轮播图
北京租房, 北京白领公寓合租 | 出租, 100% 实景拍摄 [自如网]
- http://zhuanti.ziroom.com/zhuanti/2017/nanjing/kc/index.html
- http://pic.ziroom.com/static/upload/cms/2017/06/9018bf2d9172bf1d8ce97596d33b9586.png
第 3 个轮播图
北京租房, 北京白领公寓合租 | 出租, 100% 实景拍摄 [自如网]
- http://zhuanti.ziroom.com/zhuanti/2017/zrk/zrbaitiao/index.html
- http://pic.ziroom.com/static/upload/cms/2017/04/b10f346f36e7bdf88c4227e0240e3fda.jpg
第 4 个轮播图
北京租房, 北京白领公寓合租 | 出租, 100% 实景拍摄 [自如网]
- http://zhuanti.ziroom.com/zhuanti/2017/haiyan/meetingReview/index.html
- http://pic.ziroom.com/static/upload/cms/2017/06/fc1fe40b08a9ae3bf6aa258b16eb7ba5.png
第 5 个轮播图
北京租房, 北京白领公寓合租 | 出租, 100% 实景拍摄 [自如网]
- http://zhuanti.ziroom.com/zhuanti/2017/zry/yuezu/index.html
- http://pic.ziroom.com/static/upload/cms/2017/05/cfa8a415fd40dde14062b999c8153eac.jpg
第 6 个轮播图
北京租房, 北京白领公寓合租 | 出租, 100% 实景拍摄 [自如网]
- http://www.ziroom.com/zhuanti/2017/yezhu/zhizu/m/index.html
- http://pic.ziroom.com/static/upload/cms/2017/03/ea1f3b6d6e80c7cc4ad1434639f401f7.jpg
第 7 个轮播图
北京租房, 北京白领公寓合租 | 出租, 100% 实景拍摄 [自如网]
- http://www.ziroom.com/z/nl/duanzu/kl.html
- http://pic.ziroom.com/static/upload/cms/2017/04/9b49a02a370b624fe49e3d39a6213998.jpg
参考链接:
- http://www.jianshu.com/p/9d70440d2521
- http://www.cnblogs.com/CraryPrimitiveMan/p/3674421.html
下面是根据慕课网 Node.js 教程获得的网络爬虫, 有兴趣可以研究一下, 代码仅供参考:
- // 加载 http 模块
- var http = require('http');
- // Cheerio 是一个 Node.js 的库, 它可以从 html 的片断中构建 DOM 结构, 然后提供像 jquery 一样的 css 选择器查询
- var cheerio = require('cheerio');
- // 定义爬虫的目标地址
- var url = 'http://www.imooc.com/learn/348';
- http.get(url, function(res) {
- var html = '';
- // 获取页面数据
- res.on('data', function(data) {
- html += data;
- });
- // 数据获取结束
- res.on('end', function() {
- // 通过过滤章节信息获取实际需求的课程信息
- var courseData = filterChapters(html);
- // 打印课程信息
- printCourseInfo(courseData);
- });
- }).on('error', function() {
- console.log('获取数据出错!');
- });
- /* 过滤章节信息 */
- function filterChapters(html) {
- // 沿用 JQuery 风格
- var $ = cheerio.load(html);
- // 通过类名获取章节信息
- var chapters = $('.chapter');
- // 课程数据, 该数据是一个数组
- var courseData = [];
- /* 章节信息遍历 */
- chapters.each(function(item) {
- // 获取单独的每一章
- var chapter = $(this);
- // 获取 strong 标签里面的文本, trim() 去除空格, split() 分隔成数组, 最终只获取章节标题
- var chapterTitle = chapter.find('strong').text().trim().split('\n')[0];
- // 获取 video 标签下的子标签 li 的内容
- var videos = chapter.find('.video').children('li');
- // 定义章节数据
- var chapterData = {
- chapterTitle : chapterTitle,
- videos : []
- };
- /* 视频信息遍历 */
- videos.each(function(item) {
- // 通过标签的类名来获取单独的视频信息
- var video = $(this).find('.J-media-item');
- // 视频标题
- var videoTitle = video.text().trim().split('\n')[0].trim();
- // 视频时长
- var videoTime = video.text().trim().split('\n')[1].trim();
- // 视频编号
- var id = String(video.attr('href')).split('video/')[1];
- // 填充章节信息中视频数组
- chapterData.videos.push({
- title : videoTitle,
- time : videoTime,
- id : id
- });
- });
- // 填充课程信息中的章节信息
- courseData.push(chapterData);
- });
- // 返回课程信息
- return courseData;
- }
- /* 打印课程信息 */
- function printCourseInfo(courseData) {
- // 遍历课程信息
- courseData.forEach(function(item) {
- // 获取章节标题
- var chapterTitle = item.chapterTitle;
- // 打印章节标题并换行
- console.log(chapterTitle + '\n');
- // 遍历每个章节中的视频信息并打印
- item.videos.forEach(function(video) {
- console.log('[' + video.id + ']' + video.title + '' + video.time +'\n');
- });
- });
- }
来源: https://blog.csdn.net/u012187452/article/details/73478028