egg(十七):cheerio-爬取并解析html网页2(gb2312格式中文乱码)

前言:

        在使用cheerio进行爬虫的时候,发现一个很严重的问题,就是我用了中文乱码的解决方法,但是无效,所以就追根溯源,了解了下这里相关的内容。

出现乱码的html

出现乱码的原因:

Node不支持gb2312

        那我们应该怎么处理这种呢?难道只能放弃这种格式的网页了?不不不,这种思维要不得,身为程序员,就应该打破砂锅问到底,有困难,克服困难,奥里给,继续往下把!

最终实现效果:

 

加强版使用操作步骤:

1、引入相关插件

npm install cheerio --save

 除了必须的 cheerio  外,还需要引入 superagent  与  superagent-charset

npm install superagent-charset --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 中来写我们的具体爬虫方法

1、引入 我们的插件

// 解决 gb2312格式中文乱码
const request = require('superagent')
require('superagent-charset')(request)
const cheerio = require('cheerio')

2、写具体方法

 async getHtmlRender(ctx) {
    var url = 'https://www.bxwx666.org/txt/57763/';
    // 解决 gb2312格式中文乱码
    const requestPromise = new Promise((resolve, reject) => {
      request.get(url)
        .buffer(true)
        .charset('gbk')
        .end((err, html) => {
          const htmlText = html.text
          const $ = cheerio.load(htmlText,{ decodeEntities: false })
          const imgListData = [];
          $('a').each(function () {
            let url = $(this).attr('href')
            let text = $(this).text()
            console.log(url);
            console.log(text);
            imgListData.push(url);
          })
          /**
           *	处理,保存数据等操作
           */
          return resolve({
            imgListData,
            $,
          })

        })
      })
    const result = await requestPromise;

    result['$']('a').each(function () {
      console.log(1111111111);
    })
    ctx.body = result
  }

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);
 
}

更多相关资料:

node爬虫遇到的各种问题(cheerio+puppeteer) - SegmentFault 思否环境:node@8.12.0,cheerio@0.22.0网站使用的gb2312编码,开始用http直接访问网页,cheerio加载后console出来中文全部乱码:https://segmentfault.com/a/1190000039764571node爬取新闻网并存入数据库_某段的博客-CSDN博客node爬取新闻网并存入数据库本来想用python写的,但是pycharm的导入库有点小问题,发现node.js也可以操作,经过一上午的研究和请教一些大佬,终于成功了,这里附上我执行成功的代码给各位参考,当然哪里可以优化也请指出const request = require('request')const cheerio = require('cheerio')const mysql=require('mysql')//导入库const db=mysql.createPool({host:'lhttps://blog.csdn.net/weixin_45086831/article/details/109740344

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值