资讯专栏INFORMATION COLUMN

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

hedge_hog / 3611人阅读

摘要:这样尝试了之后,网页中文编码的问题会解决大部分,但是有的地方还是存在中文乱码这样的问题主要是我在进行了转码成之后没有将新插入后的页面转码到初始状态,一旦被浏览器下载之后浏览器会无法识别部分的编码从而导致一部分编码。

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

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


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

var newDataStr = "";
             var charset="utf-8";
              var arr=responseDetail.response.body.toString().match(/]*?)>/g);
              if(arr){
                arr.forEach(function(val){
                  var match=val.match(/charsets*=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}   
         
       
     

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


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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/88979.html

相关文章

  • 分分钟教你用node.js写个爬虫

    摘要:爬虫介绍二爬虫的分类通用网络爬虫全网爬虫爬行对象从一些种子扩充到整个,主要为门户站点搜索引擎和大型服务提供商采集数据。 分分钟教你用node.js写个爬虫 写在前面 十分感谢大家的点赞和关注。其实,这是我第一次在segmentfault上写文章。因为我也是前段时间偶然之间才开始了解和学习爬虫,而且学习node的时间也不是很长。虽然用node做过一些后端的项目,但其实在node和爬虫方面...

    fanux 评论0 收藏0
  • node爬虫 抓取网页实现

    摘要:一前言一直感觉爬虫是个挺高端的东西大数据时代爬虫显得尤为重要。 一、前言 一直感觉爬虫是个挺高端的东西 大数据时代 爬虫显得尤为重要。经过一番探索,终于用node实现了这个功能,还包括对抓取内容的解析 二、正文 1、首先搭建一个http服务,这里使用我们熟悉的koa(这个是非必须的 你也可以使用纯node去抓 这里主要为了方便交互、看效果或者给非技术人员使用方便)服务端 index.j...

    alighters 评论0 收藏0
  • 使用 node 抓取网页图片

    摘要:使用抓取网页图片的使用非常广泛,可以做通信,做爬虫,甚至可以做桌面应用程序。今天就利用闲暇时间写个小小的分享利用爬取百度图片首页的图片。 使用 node 抓取网页图片 node 的使用非常广泛,可以做通信,做爬虫,甚至可以做桌面应用程序。 今天就利用闲暇时间写个小小的分享:利用 node 爬取百度图片首页的图片。 对,就是中间那几张: showImg(https://segmentfa...

    genedna 评论0 收藏0
  • Nodejs爬虫--抓取豆瓣电影网页数据(下)

    摘要:接着上篇爬虫抓取豆瓣电影网页数据上本篇主要描述将上次抓取的数据存入数据库前提百度或谷歌的安装教程,安装本地并成功运行推荐一款数据库可视化管理工具。 接着上篇 Nodejs爬虫--抓取豆瓣电影网页数据(上) 本篇主要描述将上次抓取的数据存入mongodb数据库 前提:百度或谷歌mongodb的安装教程,安装本地并成功运行 推荐一款mongodb数据库可视化管理工具:Robomongo...

    legendaryedu 评论0 收藏0
  • Nodejs爬虫--抓取豆瓣电影网页数据(下)

    摘要:接着上篇爬虫抓取豆瓣电影网页数据上本篇主要描述将上次抓取的数据存入数据库前提百度或谷歌的安装教程,安装本地并成功运行推荐一款数据库可视化管理工具。 接着上篇 Nodejs爬虫--抓取豆瓣电影网页数据(上) 本篇主要描述将上次抓取的数据存入mongodb数据库 前提:百度或谷歌mongodb的安装教程,安装本地并成功运行 推荐一款mongodb数据库可视化管理工具:Robomongo...

    techstay 评论0 收藏0

发表评论

0条评论

hedge_hog

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<