egg(十六):cheerio-爬取并解析html网页1(正常格式)

前言:

        使用nodejs开发时,有时需要获取网上的一些资料信息,不可避免的就需要爬虫的功能,这里整理下,主要使用的技术是cheerio。

cheerio用于node环境,用法与语法都类似于jquery。

注意:

        如果是遇到 gb2312 格式的导致中文乱码,用cheerio的解码方法以后还是乱码,是正常的,请看下文:

实现效果:

第一张图是:我要个性网 图片地址效果

第二张和第三张是 百度新闻的效果

 

 实现步骤:

1、安装插件

npm install cheerio --save

2、在service下新建一个 spider.js 文件

/*
 * @FilePath:\app\service\spider.js
 */
'use strict';

const Service = require('egg').Service;

class SpiderService extends Service {
    async spider(url) {
        const result = await this.ctx.curl(url);
        return result;
    }
}

module.exports = SpiderService;

 3、在 controller/home.js 中来写我们的具体爬虫方法

首先引入:

const cheerio = require('cheerio')

 方法源码1:我要个性网

async getPictureData(ctx) {
    var url = 'https://www.woyaogexing.com/touxiang/nv/2021/1159425.html'; // 以爬取 我要个性网图片为例
    const list = await ctx.service.spider.spider(url);

    // toString是为了解析出buffer数据
    const pageXml = list.data.toString();

    // decodeEntities参数是为了解决cheerio获取的中文乱码
    const $ = cheerio.load(pageXml, { decodeEntities: false });

    const imgListData = [];
    // 爬取某一个列表数据
    $('a img').each(function () {
      let text = $(this).attr('src')
      imgListData.push(text);
    })
    ctx.body = imgListData
  }

方法源码2:百度新闻

async getHtmlRender2(ctx) {
    var url = 'https://news.baidu.com/'; // 百度新闻
    const list = await ctx.service.spider.spider(url);

    // toString是为了解析出buffer数据
    const pageXml = list.data.toString();

    // decodeEntities参数是为了解决cheerio获取的中文乱码
    const $ = cheerio.load(pageXml, { decodeEntities: false });

    const textListData = [];
    $('.hotnews a').each(function () {
      var text = $(this).html();
      console.log(text);
      textListData.push(text)
    })
    ctx.body = textListData


  }

4、配置路由 router.local.js

/**
 * 路由配置
 * @param app
 */
module.exports = app => {
    const { router, controller, middleware } = app;

    //爬虫
    router.get("/getPictureData", controller.home.getPictureData);
    router.get("/getHtmlRender", controller.home.getHtmlRender);
    router.get("/getHtmlRender2", controller.home.getHtmlRender2);

}

 到这里就结束了!

如果有兴趣,可以看看系列里的别的内容,egg系列,自我探索的同时也在进步,欢迎志同道合的朋友。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值