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

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

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

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); 将其返回到最初的编码方式就能够了spa

相关文章
相关标签/搜索