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>

我们需要获取的信息主要是<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');
        });
    });
}
  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值