nodejs爬虫抓取数据乱码问题总结


Posted in NodeJs onJuly 03, 2015

一、非UTF-8页面处理.

1.背景

windows-1251编码

比如俄语网站:https://vk.com/cciinniikk

可耻地发现是这种编码

nodejs爬虫抓取数据乱码问题总结

所有这里主要说的是 Windows-1251(cp1251)编码与utf-8编码的问题,其他的如 gbk就先不考虑在内了~

2.解决方案

1.

使用js原生编码转换

但是我现在还没找到办法哈..

如果是utf-8转window-1251还可以http://stackoverflow.com/questions/2696481/encoding-conversation-utf-8-to-1251-in-javascript

var DMap = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 34: 34, 35: 35, 36: 36, 37: 37, 38: 38, 39: 39, 40: 40, 41: 41, 42: 42, 43: 43, 44: 44, 45: 45, 46: 46, 47: 47, 48: 48, 49: 49, 50: 50, 51: 51, 52: 52, 53: 53, 54: 54, 55: 55, 56: 56, 57: 57, 58: 58, 59: 59, 60: 60, 61: 61, 62: 62, 63: 63, 64: 64, 65: 65, 66: 66, 67: 67, 68: 68, 69: 69, 70: 70, 71: 71, 72: 72, 73: 73, 74: 74, 75: 75, 76: 76, 77: 77, 78: 78, 79: 79, 80: 80, 81: 81, 82: 82, 83: 83, 84: 84, 85: 85, 86: 86, 87: 87, 88: 88, 89: 89, 90: 90, 91: 91, 92: 92, 93: 93, 94: 94, 95: 95, 96: 96, 97: 97, 98: 98, 99: 99, 100: 100, 101: 101, 102: 102, 103: 103, 104: 104, 105: 105, 106: 106, 107: 107, 108: 108, 109: 109, 110: 110, 111: 111, 112: 112, 113: 113, 114: 114, 115: 115, 116: 116, 117: 117, 118: 118, 119: 119, 120: 120, 121: 121, 122: 122, 123: 123, 124: 124, 125: 125, 126: 126, 127: 127, 1027: 129, 8225: 135, 1046: 198, 8222: 132, 1047: 199, 1168: 165, 1048: 200, 1113: 154, 1049: 201, 1045: 197, 1050: 202, 1028: 170, 160: 160, 1040: 192, 1051: 203, 164: 164, 166: 166, 167: 167, 169: 169, 171: 171, 172: 172, 173: 173, 174: 174, 1053: 205, 176: 176, 177: 177, 1114: 156, 181: 181, 182: 182, 183: 183, 8221: 148, 187: 187, 1029: 189, 1056: 208, 1057: 209, 1058: 210, 8364: 136, 1112: 188, 1115: 158, 1059: 211, 1060: 212, 1030: 178, 1061: 213, 1062: 214, 1063: 215, 1116: 157, 1064: 216, 1065: 217, 1031: 175, 1066: 218, 1067: 219, 1068: 220, 1069: 221, 1070: 222, 1032: 163, 8226: 149, 1071: 223, 1072: 224, 8482: 153, 1073: 225, 8240: 137, 1118: 162, 1074: 226, 1110: 179, 8230: 133, 1075: 227, 1033: 138, 1076: 228, 1077: 229, 8211: 150, 1078: 230, 1119: 159, 1079: 231, 1042: 194, 1080: 232, 1034: 140, 1025: 168, 1081: 233, 1082: 234, 8212: 151, 1083: 235, 1169: 180, 1084: 236, 1052: 204, 1085: 237, 1035: 142, 1086: 238, 1087: 239, 1088: 240, 1089: 241, 1090: 242, 1036: 141, 1041: 193, 1091: 243, 1092: 244, 8224: 134, 1093: 245, 8470: 185, 1094: 246, 1054: 206, 1095: 247, 1096: 248, 8249: 139, 1097: 249, 1098: 250, 1044: 196, 1099: 251, 1111: 191, 1055: 207, 1100: 252, 1038: 161, 8220: 147, 1101: 253, 8250: 155, 1102: 254, 8216: 145, 1103: 255, 1043: 195, 1105: 184, 1039: 143, 1026: 128, 1106: 144, 8218: 130, 1107: 131, 8217: 146, 1108: 186, 1109: 190}

function UnicodeToWin1251(s) {
  var L = []
  for (var i=0; i<s.length; i++) {
    var ord = s.charCodeAt(i)
    if (!(ord in DMap))
      throw "Character "+s.charAt(i)+" isn't supported by win1251!"
    L.push(String.fromCharCode(DMap[ord]))
  }
  return L.join('')
}

嗯,这是个好办法,Dmap储存的其实就是window-1251编码和unicode的映射关系

nodejs爬虫抓取数据乱码问题总结

所以本打算只要反着来就行

但一反,才发现 charCodeAt 方法只对 unicode有效,其他编码是如何挖掘出其码段? 因为用的是nodejs 所以考虑使用相应模块

2.

安装使用nodejs模块iconv-lite 使用说明见https://www.npmjs.com/package/iconv-lite

按照使用方法,应该是类似这种方法使用

var iconv = require('iconv-lite');
var Buffer = require('buffer').Buffer;
// Convert from an encoded windows-1251 to utf-8
//这个str1应该是http.get 或request等请求返回的数据
//请求的时候要带参数,不然就会出错
//除了基本的参数之外 要注意记得使用 encoding: 'binary'这个参数
//比如
str1 = 'ценности ни в ';
//把获取到的数据 转换成Buffer,记得格式使用 binary
//binary在各编码直接穿梭无阻~
var buf = new Buffer(str1,'binary');
var str2 = iconv.decode(buf, 'win1251');
//str2就被转换出来了,默认是转成 Unicode格式,估计这也是iconv-lite的初衷吧
console.log(str2);

nodejs爬虫抓取数据乱码问题总结

3.

安装使用nodejs模块iconv 使用说明见https://github.com/bnoordhuis/node-iconv

(其实本质应该是安装个node-gyp就行了 之前没仔细看官方说明)

一般简单使用后,还是乱码 形如:пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ

http://stackoverflow.com/questions/8693400/nodejs-convertinf-from-windows-1251-to-utf-8

解决办法为转成二进制读取数据 encoding:binary (默认的encoding是utf-8)

request({ 
  uri: website_url,
  method: 'GET',
  encoding: 'binary'
}, function (error, response, body) {
    body = new Buffer(body, 'binary');
    conv = new iconv.Iconv('WINDOWS-1251', 'utf8');
    body = conv.convert(body).toString();
  }
});

-->另外要说的是,iconv的使用时需要一些环境依赖的,见官方说明:https://github.com/TooTallNate/node-gyp

nodejs爬虫抓取数据乱码问题总结

所以:

第一需要python对应版本(如2.7)的支持 ;

第二需要编译工具的支持(windows下出错最多)

出错类似这种

nodejs爬虫抓取数据乱码问题总结

node,如无特定版本或更高版本,默认使用vs2005编译工具(所以出错提示的解决办法一般为按照vs2005和framwork sdk2.0)

问题解决方案:

1.安装visual stutio 2010

2.指定vs编译工具版本(如果是vs2012就是2012)

(有些时候会自动指定,所有也不一定需要这个命令 npm config set msvs_version 2010 --global)

nodejs爬虫抓取数据乱码问题总结

3.如若还是提示找不到 framwork sdk,可将其安装路径添加到系统环境变量path中

(2010对应sdk4.0版本,类似的 2008 sdj3.5 2012 sdk4.5?)

另外要记得的是,环境变量只会读取第一个!

比如你之前已经有了 SDK2.0的路径设到了系统环境变量中,那么你现在再增加设置一个SDK4.0的路径的时候,起作用的只有第一个

所以:

要么把之前那个删了

要么把想添加的路径放到那个前面

nodejs爬虫抓取数据乱码问题总结

二、gzip页面处理

有时候我们发现浏览器访问页面是正常的,但是模拟请求回来就乱码了,可以查看一下浏览器请求的Response信息,如果有Content-Encoding:gzip,极有可能是因为页面被gzip压缩了,这时请求时需要添加如下参数

gzip:true

以上所述就是本文的全部内容了,希望大家能够喜欢。

NodeJs 相关文章推荐
golang、python、php、c++、c、java、Nodejs性能对比
Mar 12 NodeJs
用nodejs写的一个简单项目打包工具
May 11 NodeJs
基于 Docker 开发 NodeJS 应用
Jul 30 NodeJs
Nodejs中 npm常用命令详解
Jul 04 NodeJs
Nodejs实现短信验证码功能
Feb 09 NodeJs
解决nodejs中使用http请求返回值为html时乱码的问题
Feb 18 NodeJs
NodeJS测试框架mocha入门教程
Mar 28 NodeJs
NodeJs安装npm包一直失败的解决方法
Apr 28 NodeJs
Nodejs中使用captchapng模块生成图片验证码
May 18 NodeJs
NodeJS实现视频转码的示例代码
Nov 18 NodeJs
基于nodejs实现微信支付功能
Dec 20 NodeJs
Nodejs技巧之Exceljs表格操作用法示例
Nov 06 NodeJs
nodejs导出excel的方法
Jun 30 #NodeJs
nodejs实现获取当前url地址及url各种参数值
Jun 25 #NodeJs
使用nodejs开发cli项目实例
Jun 03 #NodeJs
nodejs实现遍历文件夹并统计文件大小
May 28 #NodeJs
nodejs实现获取某宝商品分类
May 28 #NodeJs
Nodejs实现批量下载妹纸图
May 28 #NodeJs
ubuntu下安装nodejs以及升级的办法
May 08 #NodeJs
You might like
ThinkPHP标签制作教程
2014/07/10 PHP
分享PHP源码批量抓取远程网页图片并保存到本地的实现方法
2015/12/01 PHP
Smarty模板常见的简单应用分析
2016/11/15 PHP
php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击
2016/12/23 PHP
PHP日志LOG类定义与用法示例
2018/09/06 PHP
浅谈PHP封装CURL
2019/03/06 PHP
js加解密 脚本解密
2008/02/22 Javascript
jQuery Study Notes学习笔记 (二)
2010/08/04 Javascript
firefox下jQuery UI Autocomplete 1.8.*中文输入修正方法
2012/09/19 Javascript
nodejs下打包模块archiver详解
2014/12/03 NodeJs
JavaScript实现在页面间传值的方法
2015/04/07 Javascript
angularJS与bootstrap结合实现动态加载弹出提示内容
2015/10/16 Javascript
javascript如何实现暂停功能
2015/11/06 Javascript
js实现简单的省市县三级联动效果实例
2016/02/18 Javascript
谈谈JavaScript数组常用方法总结
2017/01/24 Javascript
浅谈js获取ModelAndView值的问题
2018/03/28 Javascript
详解webpack编译速度提升之DllPlugin
2019/02/05 Javascript
websocket4.0+typescript 实现热更新的方法
2019/08/14 Javascript
vue不操作dom实现图片轮播的示例代码
2019/12/18 Javascript
关于angular引入ng-zorro的问题浅析
2020/09/09 Javascript
使用node-media-server搭建一个简易的流媒体服务器
2021/01/20 Javascript
Python标准库之多进程(multiprocessing包)介绍
2014/11/25 Python
使用Python对MySQL数据操作
2017/04/06 Python
matplotlib subplots 设置总图的标题方法
2018/05/25 Python
Python高斯消除矩阵
2019/01/02 Python
详解用Python实现自动化监控远程服务器
2019/05/18 Python
python里运用私有属性和方法总结
2019/07/08 Python
Django文件上传与下载(FileFlid)
2019/10/06 Python
Python 实现数组相减示例
2019/12/27 Python
浅谈python的elementtree模块处理中文注意事项
2020/03/06 Python
Pycharm生成可执行文件.exe的实现方法
2020/06/02 Python
对Pytorch 中的contiguous理解说明
2021/03/03 Python
使用css3背景渐变中的透明度来设置不同颜色的背景渐变
2014/03/31 HTML / CSS
Net-A-Porter美国官网:全球时尚奢侈品名站
2017/02/11 全球购物
机工车间主任岗位职责
2014/03/05 职场文书
电力培训心得体会
2014/09/02 职场文书