課程
/前端開發
/Node.js
/進擊Node.js基礎(二)
有時候Node.js爬蟲采集到的數據有少數漢字亂碼,不知道怎么解決?
2016-06-11
源自:進擊Node.js基礎(二) 1-4
正在回答
亂碼原因是傳輸數據時 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(); });
好像不是編碼問題,如果是編碼問題,每次爬去的中文應該全部是亂碼。我的現象是連續爬取多次,只有其中某一的幾個中文亂碼。應該和數據流或緩沖有關系。
var iconv = require('iconv-lite');
安裝 ?iconv-lite
在獲取Body之后轉碼
body = iconv.decode(body, 'gbk');
舉報
本教程帶你攻破 Nodejs,讓 JavaScript流暢運行在服務器端
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2016-06-11
亂碼原因是傳輸數據時 buffer 的拼接問題!
例如以下寫法:
如果爬取的數據的中文數據量比較小,一般顯示是正常的。但當爬取的數據量較大時,很有可能出現部分漢字會亂碼現象。
產生原因:
在默認的情況下 trunk 是一個 Buffer 對象,而
的實質上隱藏了 toString 的變換的:
由于漢字不是用一個字節來存儲的,如果某一塊 buffer 傳輸的恰好不完整,將會導致有被截破的漢字的存在,于是出現亂碼。
解決方法:
先用一個數組把所有 buffer 保存起來,同時記錄 buffer 的總長度。
數據傳輸完畢的時,再通過 Buffer.concat 方法把所有 buffer 拼接。
最后,用 toString 方法轉成字符串,這時獲取的 data 數據就是正確的了。
// 在更細膩的?buffer?連接方式:
2016-06-11
好像不是編碼問題,如果是編碼問題,每次爬去的中文應該全部是亂碼。我的現象是連續爬取多次,只有其中某一的幾個中文亂碼。應該和數據流或緩沖有關系。
2016-06-11
var iconv = require('iconv-lite');
安裝 ?iconv-lite
在獲取Body之后轉碼
body = iconv.decode(body, 'gbk');