当前位置: 首页 > 后端技术 > Node.js

关于使用cheerio抓取网页及解决过程

时间:2023-04-03 14:49:40 Node.js

最近需要用cheerio抓取网页,然后在标签末尾插入一段js脚本。然后确保浏览器正常运行。现在记录下这些遇到的问题。这里有个问题:Node.js默认不支持utf-8编码,所以爬取非utf-8中文网页时会出现乱码。比如网易的首页编码是gb2312,会出现乱码,百度下大佬的意见是使用icon-lite进行转码(有兴趣的可以自己用百度cheerio中文乱码)。(只是他们说的和我的不一样,需要把网页返回给浏览器)。然后我开始尝试。思路大致是这样的:获取代理层将要请求的html请求头的header中的content-type,以确定网页的编码方式。然后使用iconv.decode进行相应的转码,然后做js替换。但是这种情况是有漏洞的,如下图,有些网站开发不够规范,甚至content-type连网页的编码方式都没有声明。因此,这条路是行不通的。我们只能通过抓取标签来确定网页对应的编码,然后进行转码。varnewDataStr='';变种字符集=“UTF-8”;vararr=responseDetail.response.body.toString().match(/]*?)>/g);if(arr){arr.forEach(function(val){varmatch=val.match(/charset\s*=\s*(.+)\"/);if(match&&match[1]){如果(match[1].substr(0,1)=='"')match[1]=match[1].substr(1);charset=match[1].trim();返回false;}})}varhtml=iconv.decode(responseDetail.response.body,字符集);//varhtml=responseDetail.response.body.toString();var$=cheerio.load(html);responseDetail.response.body=newDataStr;return{response:responseDetail.response}这样尝试后,网页中文编码的问题大部分都解决了,但是还是有一些地方出现中文乱码等问题。主要原因是我没有把新插入的页面转码成gbk后在nodeCode中转换到初始状态,一旦被浏览器下载,浏览器将无法识别部分jsxhr编码,导致部分编码。所以newDataStr=iconv.encode($.html(),charset);回到原来的编码方式就可以了