简单使用cheerio模块采集数据

2018年12月18日作者:井井客整理来源:原创

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

简单使用cheerio模块采集数据

代码如下:

const http = require('http');
const cheerio = require('cheerio');
 
getHtml('http://www.jingjingke.com/c/', ($) => {
    getList($('.pageinfo strong').eq(0).text());
}).then(() => {
    console.log("分页数获取成功!");
});
 
async function getList(num) {
    let list = [];
    for (let page = 1; page <= num; page++) {
        try {
            let arr = [];
            await getHtml(`http://www.jingjingke.com/c/list_${page}.html`, ($) => {
                $('.leftArticle li').each(function() {
                    arr.push({
                        title: $(this).find("h3").text()
                    })
                })
            }).then(() => {
                console.log("第" + page + "/" + num + "页数据获取完成!");
            });
            list = list.concat(arr);
        } catch (error) {
            console.log(error)
        }
    }
    // 打印采集结果
    console.log(JSON.stringify(list))
}
 
// 获取html内容
function getHtml(url, successFn) {
    return new Promise((resolve) => {
        http.get(url, (res) => {
            const {statusCode} = res;
            const contentType = res.headers['content-type'];
 
            let error;
            if (statusCode !== 200) {
                error = new Error(`请求失败!/n状态码 ${statusCode}`);
            } else if (!/^text/html/.test(contentType)) {
                error = new Error(`无效content-type!/n期望收到text/html但结果收到${contentType}`);
            }
 
            if (error) {
                console.error(error.message);
                res.resume();
                return;
            }
 
            res.setEncoding('utf8');
 
            let htmlData = '';
            res.on('data', (chunk) => {
                htmlData += chunk;
            });
 
            res.on('end', () => {
                try {
                    successFn(cheerio.load(htmlData));
                    resolve();
                } catch (e) {
                    console.error(e.message);
                }
            })
        })
    })
}

使用前安装node啥的不用说,因为http是node自带的模块,只需要npm install cheerio。

然后在终端中使用node 该文件名就可以执行了。它先会获取总页数,再每一页去抓取标题,最后打印出结果。

不过这个比较适合服务端渲染的页面,并且核心代码其实是http模块获取到数据,利用cheerio从html字符串中提取需要的数据反而是其次了。

另外有时是用二进制数据流传递网页的,这时可用下面的方法接受并转化为html字符串。

const https = require('https');

https.get('https://www.baidu.com/', (res) => {
    let chunks = [];
    let size = 0;
    res.on('data', (chunk) => {
        chunks.push(chunk);
        size += chunk.length;
    });

    res.on('end', () => {
        let htmlData = Buffer.concat(chunks, size).toString();
        console.log(htmlData)
    })
}).on('error', (e) => {
    console.error(e);
});

文章TAG:Node

本文标题:简单使用cheerio模块采集数据
本文链接:http://www.jingjingke.com/c/18353.html

上一篇:Js判断2019年工作日休息日
下一篇:采集新浪微博头条数据小demo