您的位置:首页 > 理论基础 > 计算机网络

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

2017-06-19 23:05 961 查看
准备工作

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>
4000

</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);
// 打印课程信息
printC
c481
ourseInfo(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');
});
});
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: