亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

有時候Node.js爬蟲采集到的數據有少數漢字亂碼,不知道怎么解決?

有時候Node.js爬蟲采集到的數據有少數漢字亂碼,不知道怎么解決?

正在回答

3 回答

亂碼原因是傳輸數據時 buffer 的拼接問題!

例如以下寫法:

var?data?=?"";
res.on("data"?,?function(chunk){
????data?+=?chunk;
});

如果爬取的數據的中文數據量比較小,一般顯示是正常的。但當爬取的數據量較大時,很有可能出現部分漢字會亂碼現象。

產生原因:
在默認的情況下 trunk 是一個 Buffer 對象,而

data?+=?trunk

的實質上隱藏了 toString 的變換的:

data?=?data.toString()?+?trunk.toString();

由于漢字不是用一個字節來存儲的,如果某一塊 buffer 傳輸的恰好不完整,將會導致有被截破的漢字的存在,于是出現亂碼。

解決方法:
先用一個數組把所有 buffer 保存起來,同時記錄 buffer 的總長度。
數據傳輸完畢的時,再通過 Buffer.concat 方法把所有 buffer 拼接。
最后,用 toString 方法轉成字符串,這時獲取的 data 數據就是正確的了。

var?chunks?=?[],?size?=?0;
res.on("data"?,?function(chunk){
????chunks.push(chunk);
????size?+=?chunk.length;
});
res.on("end"?,?function(){
????var?buffer?=?Buffer.concat(chunks,?size);
????var?html?=?buffer.toString();
});

// 在更細膩的?buffer?連接方式:

res.on('end',?function?()?{
????var?buffer?=?null;
????switch(buffers.length)?{
????????case?0:
????????????buffer?=?new?Buffer(0);
????????????break;
????????case?1:
????????????buffer?=?buffers[0];
????????????break;
????????default:
????????????buffer?=?new?Buffer(size);
????????????for?(var?i?=?0,?pos?=?0,?l?=?buffers.length;?i?<?l;?i++)?{
????????????????var?chunk?=?buffers[i];
????????????????chunk.copy(buffer,?pos);
????????????????pos?+=?chunk.length;
????????????}
????????break;
????}
????var?html?=?buffer.toString();
});


1 回復 有任何疑惑可以回復我~

好像不是編碼問題,如果是編碼問題,每次爬去的中文應該全部是亂碼。我的現象是連續爬取多次,只有其中某一的幾個中文亂碼。應該和數據流或緩沖有關系。

0 回復 有任何疑惑可以回復我~

var iconv = require('iconv-lite');

安裝 ?iconv-lite

在獲取Body之后轉碼

body = iconv.decode(body, 'gbk');




0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
進擊Node.js基礎(二)
  • 參與學習       76735    人
  • 解答問題       242    個

本教程帶你攻破 Nodejs,讓 JavaScript流暢運行在服務器端

進入課程

有時候Node.js爬蟲采集到的數據有少數漢字亂碼,不知道怎么解決?

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號