美文网首页Vue
Nodejs使用cheerio爬取网站数据

Nodejs使用cheerio爬取网站数据

作者: beatzcs | 来源:发表于2019-04-08 17:35 被阅读0次
    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学习之网络爬虫

    相关文章

      网友评论

        本文标题:Nodejs使用cheerio爬取网站数据

        本文链接:https://www.haomeiwen.com/subject/jqspiqtx.html