详解nodejs爬虫程序解决gbk等中文编码问题

2020-06-17 07:22:30易采站长站整理

i++;
}
}
var newBuf = new Buffer(len*2);
for (var i = 0, j = 0, _len = buf.length; i < _len; i++, j++) {
var temp = buf[i], gbkcode, unicode;
if (temp & 0x80) {
gbkcode = (temp << 8) + buf[++i];
unicode = table[gbkcode] || iconv.defaultCharUnicode.charCodeAt(0);//not found in table, replace with defaultCharUnicode
}else {
unicode = temp;
}
newBuf[j*2] = unicode & 0xFF;//low byte
newBuf[j*2+1] = unicode >> 8;//high byte
}
return newBuf.toString('ucs2');
}

可以看到最终返回的是newBuf.toString(‘ucs2′)字符串。

爬虫程序源码如下:


var cheerio = require('cheerio');
var http = require('http');
var iconv = require('iconv-lite');
var htmlData = [];
var htmlDataLength = 0;
var count = 0;

http.globalAgent = 'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1';
http.get('http://www.cr173.com', function(res) {

res.on('data', function(data) {

htmlData.push(data);
htmlDataLength += data.length;
count ++;
});

res.on('end',function(){

callback(htmlData);
});

});

function callback(htmlData){

console.log(count);
var bufferHtmlData = Buffer.concat(htmlData,htmlDataLength);
var charset = '';
var decodeHtmlData;
var htmlHeadTitle = '';
var htmlHeadCharset = '';
var htmlHeadContent = '';
var index = 0;

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

$('meta','head').each(function(i, e) {

htmlHeadCharset = $(e).attr('charset');
htmlHeadContent = $(e).attr('content');

if(typeof(htmlHeadCharset) != 'undefined'){

charset = htmlHeadCharset;
}

if(typeof(htmlHeadContent) != 'undefined'){

if(htmlHeadContent.match(/charset=/ig)){

index = htmlHeadContent.indexOf('=');
charset = htmlHeadContent.substring(index+1);
}
}
});

//此处为什么需要对整个网页进行转吗,是因为cheerio这个组件不能够返回buffer,iconv则无法转换之
if(charset.match(/gb/ig)){

decodeHtmlData = iconv.decode(bufferHtmlData,'gbk');
}
else{//因为有可能返回的网页中不存在charset字段,因此默认都是按照utf8进行处理

decodeHtmlData = iconv.decode(bufferHtmlData,'utf8');
}

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

$('title','head').each(function(i, e) {

htmlHeadTitle = $(e).text();
console.log(htmlHeadTitle);
});

console.log(charset);

}