Node.js抓取中文网页乱码问题和解决方法


Posted in Javascript onFebruary 10, 2015

Node.js 抓取非 utf-8 的中文网页时会出现乱码问题,比如网易的首页编码是 gb2312,抓取时会出现乱码

var request = require('request')  

var url = 'http://www.163.com'
request(url, function (err, res, body) {  

    console.log(body)

})

可以使用 iconv-lite 来解决

安装

npm install iconv-lite 

同时我们顺带把 user-agent 修改一下,以防网站屏蔽:
var originRequest = require('request')  

var iconv = require('iconv-lite')  

var headers = {  

  'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36'

}
function request (url, callback) {  

  var options = {

    url: url,

    encoding: null,

    headers: headers

  }

  originRequest(options, callback)

}
request(url, function (err, res, body) {  

    var html = iconv.decode(body, 'gb2312')

    console.log(html)

})

乱码问题解决

使用 cheerio 解析 HTML

cheerio 可以简单粗暴的理解为服务器端 jQuery 选择器,有了它,比正则要更加直观许多

安装

npm install cheerio  

request(url, function (err, res, body) {  

    var html = iconv.decode(body, 'gb2312')

    var $ = cheerio.load(html)

    console.log($('h1').text())

    console.log($('h1').html())

})

输出如下
网易

网易

那么问题来了,$('h1').html() 输出的代码是经过 Unicode 编码的,网易变成了网易,给我们的字符处理带来了一些麻烦

解决 cheerio .html() 「乱码」问题
查阅文档可知,可以关闭这个转换实体编码的功能

var $ = cheerio.load(html) 

改成
var $ = cheerio.load(html, {decodeEntities: false})

即可,完整代码如下:
var originRequest = require('request')  

var cheerio = require('cheerio')  

var iconv = require('iconv-lite')  

var headers = {  

  'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36'

}
function request (url, callback) {  

  var options = {

    url: url,

    encoding: null,

    headers: headers

  }

  originRequest(options, callback)

}
var url = 'http://www.163.com'
request(url, function (err, res, body) {  

    var html = iconv.decode(body, 'gb2312')

    var $ = cheerio.load(html, {decodeEntities: false})

    console.log($('h1').text())

    console.log($('h1').html())

})
Javascript 相关文章推荐
JavaScript的面向对象(一)
Nov 09 Javascript
JQuery 学习笔记 element属性控制
Jul 23 Javascript
ASP.NET jQuery 实例13 原创jQuery文本框字符限制插件-TextArea Counter
Feb 03 Javascript
JavaScript框架是什么?怎样才能叫做框架?
Jul 01 Javascript
javascript去掉代码里面的注释
Jul 24 Javascript
JavaScript编程的单例设计模讲解
Nov 10 Javascript
详解AngularJS中$http缓存以及处理多个$http请求的方法
Feb 06 Javascript
angularjs的select使用及默认选中设置
Apr 08 Javascript
详解vue.js2.0父组件点击触发子组件方法
May 10 Javascript
JS实现的四级密码强度检测功能示例
May 11 Javascript
Vue 使用formData方式向后台发送数据的实现
Apr 14 Javascript
json解析大全 双引号、键值对不在一起的情况
Dec 06 Javascript
JS数组的常见用法实例
Feb 10 #Javascript
bootstrap table 服务器端分页例子分享
Feb 10 #Javascript
js实现对table动态添加、删除和更新的方法
Feb 10 #Javascript
js+css实现导航效果实例
Feb 10 #Javascript
jquery.mobile 共同布局遇到的问题小结
Feb 10 #Javascript
jquery中EasyUI使用技巧小结
Feb 10 #Javascript
javascript操作符"!~"详解
Feb 10 #Javascript
You might like
PHP+MYSQL的文章管理系统(二)
2006/10/09 PHP
php cache类代码(php数据缓存类)
2010/04/15 PHP
PHP MySQL应用中使用XOR运算加密算法分享
2011/08/28 PHP
smarty的section嵌套循环用法示例
2016/05/28 PHP
PHP中类属性与类静态变量的访问方法示例
2016/07/13 PHP
用PHP将Unicode 转化为UTF-8的实现方法(推荐)
2017/02/08 PHP
php使用环形链表解决约瑟夫问题完整示例
2018/08/07 PHP
PHP集成环境XAMPP的安装与配置
2018/11/13 PHP
高性能JavaScript 重排与重绘(2)
2015/08/11 Javascript
jquery日历插件e-calendar升级版
2016/11/10 Javascript
js中string和number类型互转换技巧(分享)
2016/11/28 Javascript
详解JS: reduce方法实现 webpack多文件入口
2017/02/14 Javascript
JavaScript瀑布流布局实现代码
2017/05/06 Javascript
JS实现的计数排序与基数排序算法示例
2017/12/04 Javascript
angular 服务的单例模式(依赖注入模式下)详解
2018/10/22 Javascript
js验证身份证号码记录的方法
2019/04/26 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
2020/05/20 Javascript
手把手带你搭建一个node cli的方法示例
2020/08/07 Javascript
详解python 发送邮件实例代码
2016/12/22 Python
pandas Dataframe行列读取的实例
2018/06/08 Python
python实现随机梯度下降法
2020/03/24 Python
pygame游戏之旅 添加碰撞效果的方法
2018/11/20 Python
python中partial()基础用法说明
2018/12/30 Python
Python实现html转换为pdf报告(生成pdf报告)功能示例
2019/05/04 Python
解决Pytorch 训练与测试时爆显存(out of memory)的问题
2019/08/20 Python
python实现静态服务器
2019/09/05 Python
python爬虫多次请求超时的几种重试方法(6种)
2020/12/01 Python
详解CSS3选择器:nth-child和:nth-of-type之间的差异
2017/09/18 HTML / CSS
幼儿教师研修感言
2014/02/12 职场文书
食品安全宣传标语
2014/06/07 职场文书
初级党校心得体会
2014/09/11 职场文书
入党个人总结范文
2015/03/02 职场文书
2015年酒店工作总结范文
2015/04/07 职场文书
人工作失职检讨书
2015/05/05 职场文书
历史博物馆观后感
2015/06/05 职场文书
CentOS7安装MySQL8的超级详细教程(无坑!)
2022/06/10 Servers