Node.js学习之网络爬虫(使用cheerio抓取网页数据)

准备工作
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安装完成后,可以进行网页数据抓取。

这里以抓取自如友家主页上轮播图为例。
首先分析一下轮播图源代码(打开自如友家的首页,按下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>

我们需要获取的信息主要是

  • 标签中子标签的href属性值,以及子标签的_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');
            });
        });
    }
  • 你可能感兴趣的:(Node.js,JavaScript)