nodejs爬虫乱码数据汇总
第一,非UTF-8页处理。
1.背景
Windows-1251编码
例如,俄罗斯网站:https://vk.com/cciinniikk
可耻地发现正是这个代码
这里所有的问题主要是关于Windows-1251(cp1251)编码和utf-8编码,其他如gbk就不先考虑了~
2.解决方法
1.
使用js本机编码进行转换
但我还没找到办法,是吧.
如果是utf-8到window-1251,也可以使用http://StackOverflow。com/Questions/2696481/编码-对话-UTF-8-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,1133: 11,1233: 12,1333: 112 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、82503360 155、11023360 254、82163360 145、1103: 255、1043: 195、1105: 184、1039: 143、1026: 长度; I){ var order=s . charcodeat(I)if(!win1251不支持抛出"字符”刘亦菲推(弦。FromCharCode(DMap[order])返回L.join(" ")嗯,这是个好办法,Dmap储存的其实就是1251号窗口编码和采用双字节对字符进行编码的映射关系
所以本打算只要反着来就行
相反,发现charCodeAt方法只对unicode有效。其他代码如何挖掘出自己的代码段?因为使用了nodejs,所以考虑使用相应的模块
2.
有关安装和使用nodejs模块iconv-lite的说明,请参见https://www.npmjs.com/package/iconv-lite
根据使用方法,应该像这样使用
var iconv=require(' iconv-lite ');var Buffer=required(' Buffer ')。缓冲区;//从编码的windows-1251转换为utf-8//这个str1应该是http.get或request等请求返回的数据。//发出请求时,要带参数,否则会出错。//除了基本参数之外,记得使用encoding: 'binary '参数。//比如str 1='//把采集到的数据转换成Buffer,记住格式使用binary//binary直接穿梭在每个代码中~var buf=new Buffer(str1,' binary ');var str2=iconv.decode(buf,' win 1251 ');//str2转换,默认转换为Unicode格式。估计这也是iconv-lite console.log(str2)的初衷;
3.
有关安装和使用nodejs模块iconv的说明,请参见https://github.com/bnoordhuis/node-iconv
(其实本质应该是安装一个节点——gyp。之前没有仔细看官方说明。)
一般来说,在简单使用后,它仍然是乱码,如:
http://stackoverflow.com/questions/8693400/nodejs-convert nf-from-windows-1251-to-utf-8
解决方案是读取数据编码:二进制到二进制(默认编码是utf-8)
请求({ uri:网站_url,method: 'GET ',encoding: 'binary'}),函数(错误,响应,body) { body=new Buffer(body,' binary ');conv=新图标。Iconv('WINDOWS-1251 ',' utf8 ');body=conv.convert(body)。toString();}});-此外,iconv的使用需要一定的环境依赖性。见官方描述:https://github.com/TooTallNate/node-gyp
所以:
首先,它需要相应版本python的支持(比如2.7);
第二,需要编译工具的支持(错误最多的是windows)
像这样的错误
节点,如果没有特定版本或更高版本,默认使用vs2005编译工具(所以错误提示的解决方案一般按照vs2005和framwork sdk2.0)
问题解决方案:
1.安装visual stutio 2010
2.指定vs编译器版本(如果是vs2012,则为2012)
(有时会自动指定,所以这个命令NPM配置集msvs _ version 2010-global不是必需的。)
3.如果您仍然注意到找不到framwork sdk,您可以将其安装路径添加到系统环境变量path中
(2010对应sdk4.0版本,类似2008 sdj3.5 2012 sdk4.5?)
还要记住,环境变量只会读取第一个!
例如,如果您之前在系统环境变量中设置了SDK2.0路径,那么当您现在添加另一个SDK4.0路径时,只有第一个路径会起作用
所以:
或者删除前一个
或者把你想添加的路径放在前面
二、gzip页面处理
有时候我们发现浏览器访问页面是正常的,但是当模拟的请求回来的时候,就乱码了。您可以检查浏览器请求的响应信息。如果有Content-Encoding:gzip,很可能是因为页面被gzip压缩了。在这种情况下,请求时需要添加以下参数。
gzip:true
以上就是本文的全部内容,希望大家喜欢。
版权声明:nodejs爬虫乱码数据汇总是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。