当前位置: 首页 > 工具软件 > cheerio > 使用案例 >

自学node+cheerio简单爬虫

萧繁
2023-12-01

文章开头先介绍一下主角 cheerio

cheerio是nodejs的抓取页面模块,为服务器特别定制的,快速、灵活、实施的jQuery核心实现。适合各种Web爬虫程序。

也就是用我们熟悉的jQuery语法,在服务器端对第三方网页的html文档进行操作。

 

步骤开始:

首先让我们先导入本篇文章的主角

const https = require('https');
const cheerio = require('cheerio');

并且定义一个变量来储存需要爬取的网址,因为我都存在Json文件或者数据库中了,地址都是直接读取,这里就不定义了,这里的‘item.url’就是我所爬取的网址。

接着就是用https打开了

https.get(item.url, function (res) {
        let chunks = [],
            size = 0;
        res.on('data', function (chunk) {
            chunks.push(chunk);
            size += chunk.length;
        });
        res.on('end', function () {
            console.log('数据包传输完毕');
        });
    })

代码很简单,通过https模块去get我们这个URL的链接,从这个链接不断下载一个个的字节流数据过来,等到数据流传输完了,监听end,就可以把这些字节码打包成一个完整的数据包,将字节码转成字符,就是我们所需要的数据。

接着我们在end里添加如下代码

            let data = Buffer.concat(chunks, size);
            let html = data.toString();
            let $ = cheerio.load(html);

此时data为获取到的字节码,通过toString()可将其转换为 html文档,再通过 cheerio 的load方法将其注入cheerio,并定义为$,我们就可以使用jQuery语法来对获取到的html进行本地操作了

建议封装成一个方法,通过入参回调函数来得到$,我们就可以方便的为不同的页面编写不同的解析放法了;

crawlDatas(item, getDeful)

function crawlDatas(item, fn) {
    https.get(item.url, function (res) {
        let chunks = [],
            size = 0;
        res.on('data', function (chunk) {
            chunks.push(chunk);
            size += chunk.length;
        });

        res.on('end', function () {
            // console.log('连接成功');
            let data = Buffer.concat(chunks, size);
            let html = data.toString();
            let $ = cheerio.load(html);
            //-------------------------------------------------------
            let result = {
                ...item,
                logo: '',
                getTime: 0,
                datas: []
            };
            result = fn($, result);//解析界面
     
            
        });
    });
}


function getDeful($, result) {
    result.logo = $('.b-A').find('img').attr('src')
    result.smallLogo = result.logo + '_50x50.png';
    $('.jc-c').find('tbody').find('tr').each((i, item) => {
        if (i > 9) return false

        let map = {};
        map.head = $(item).find("td").eq(0).text();
        let title = $(item).find('a').text();
        title = title.substring(0, title.length - 1);
        map.title = title;
        map.url = $(item).find('a').attr('href');
        map.hot = $(item).find('td').eq(2).text();

        result.datas.push(map);
        map = {};
    });
    return result;
}


result用来储存解析页面后的数据,可以把它存进json或数据库,这样就可以为我所用了

本文技术自学于以下文章

https://www.jianshu.com/p/a2f02f5e0cc2

 

end。

 类似资料: