Cheerio:
Cheerio 是一个Node.js的库, 它可以从html的片断中构建DOM结构,
然后提供像jquery一样的css选择器查询
本文实现一个抓取类别列表的功能.
一丶圈点勾画:
1.查找a标签的href:
var pic_href = pic.find('a').attr('href');
2.查找a标签的子标签img并获取_src
var pic_src = pic.find('a').children('img').attr('_src');
3.查找a标签的子标签img并获取alt
var pic_message = pic.find('a').children('img').attr('alt');
4.查找a, h1标签的文本
var atitle = dd.find('a').text().trim();
var htitle = dd.find('h1').text().trim();
5.查找标签有多个
diypage.find('dd').each(function () {
var dd = $(this);
var list = [];
var title = dd.find('h1').text().trim();
dd.find('a').each(function () {
list.push($(this).text().trim());
});
htmlListData.push({
title: title,
kindList: list
});
});
二丶出现的问题
页面使用的gbk编码, 获取到的a标签, h1标签的文本内容出现乱码.
解决办法: 引入iconv-lite库.
var chunk = iconv.decode(Buffer.concat(datas), 'gbk');
三丶类别列表的效果图:
demo.png四丶全部代码如下:
// 加载http模块
var http = require('http');
// Cheerio 是一个Node.js的库, 它可以从html的片断中构建DOM结构
// 然后提供像jquery一样的css选择器查询
var cheerio = require('cheerio');
var iconv = require('iconv-lite');
// 定义网络爬虫的目标地址(自行更改)
var url = 'http://www.xxx.com/xxx?yyy=zzz';
http.get(url, function (res) {
var datas = [];
// 获取页面数据
res.on('data', function (data) {
datas.push(data);
});
// 数据获取结束
res.on('end', function () {
var chunk = iconv.decode(Buffer.concat(datas), 'gbk');
var htmlListData = filterHtmlList(chunk);
printInfo(htmlListData);
});
}).on('error', function () {
console.log('获取数据出错!');
});
/* 过滤页面信息 */
function filterHtmlList(html) {
if (html) {
// 沿用JQuery风格,定义$
var $ = cheerio.load(html);
// 根据id列表信息
var diypage = $('#diypage');
var htmlListData = [];
/* 列表信息遍历 */
diypage.find('dd').each(function () {
var dd = $(this);
var list = [];
var title = dd.find('h1').text().trim();
dd.find('a').each(function () {
list.push($(this).text().trim());
});
htmlListData.push({
title: title,
kindList: list
});
});
return htmlListData;
} else {
console.log('无数据传入!');
}
}
/* 打印信息 */
function printInfo(htmlListData) {
// 计数
var count = 0;
// 遍历信息列表
htmlListData.forEach(function (item) {
// 获取图片
var title = item.title;
// 获取图片对应的链接地址
var kindList = item.kindList;
// 打印信息
console.log('第' + (++count) + '个类别:' + title);
console.log('\n');
kindList.forEach(function (sitem) {
console.log(sitem + " ");
})
console.log('\n');
console.log('------------------------------');
console.log('\n');
});
}
参考链接:
1. cheerio库中文文档
2. Node.js学习之网络爬虫
网友评论