关于使用cheerio抓取一个网页遇见的问题以及解决的过程

最近做开发有一个需求需要用cheerio抓取一个网页,然后将一段js脚本插入到<body>标签的末尾。然后还要保证浏览器运行正常。现在把这些遇见过的问题记录一下。
这里面就存在一个问题就是 :

Node.js默认是不支持utf-8编码的,所以抓取非 utf-8 的中文网页时会出现乱码问题,比如网易的首页编码是 gb2312,抓取时会出现乱码,百度下众大佬们的看法都是使用icon-lite 进行转码(有兴趣可以自行百度cheerio中文乱码)。(只是他们说的情况跟我这边还不太一样。我需要将网页返还给浏览器)。然后我就开始动手试了一下。思路大概是这样的:获取代理层将请求回来的html请求头header中的content-type 来判断这个网页的编码方式。然后使用iconv.decode将其进行相应的转码然后在做js替换。但是这样的话是有漏洞的,如下图

clipboard.png
有的网站开发规范性不够甚至在content-type 连网页的编码方式都不去声明。所以这条路是不通的只能通过抓取标签<meta charset>来确定网页相应的编码进而转码。

var newDataStr = '';
             var charset="utf-8";
              var arr=responseDetail.response.body.toString().match(/<meta([^>]*?)>/g);
              if(arr){
                arr.forEach(function(val){
                  var match=val.match(/charset\s*=\s*(.+)\"/);
                  if(match && match[1]){
                    if(match[1].substr(0,1)=='"')match[1]=match[1].substr(1);
                    charset=match[1].trim();
                    return false;
                  }
                })
                  }
                var html = iconv.decode(responseDetail.response.body, charset);

         // var html = responseDetail.response.body.toString();
         var $ = cheerio.load(html);
         responseDetail.response.body = newDataStr;
         return  {response: responseDetail.response}   
         
       
     

这样尝试了之后,网页中文编码的问题会解决大部分,但是有的地方还是存在中文乱码

clipboard.png
这样的问题主要是我在node进行了转码成gbk之后没有将新插入后的页面转码到初始状态,一旦被浏览器下载之后浏览器会无法识别部分js xhr的编码从而导致一部分编码。所以

newDataStr=iconv.encode($.html(), charset); 将其返回到最初的编码方式就可以了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值