Node.js 爬蟲使用 GOT 與 iconv 解決 Big5 轉 UTF-8 網頁亂碼問題

最近因為有需要寫爬蟲的需求,使用 Node.js 來處理寫完之後發現網頁的預設編碼會有問題中文的部分會亂碼,所以就用 curl 測試一下在 meta 發現

<meta http-equiv="Content-Type" content="text/html; charset=big5">

天阿!竟然是 Big5 不過想想好像有聽說對方的伺服器是使用 ASP.NET 寫的好吧!也只能處理了,那在 Node.js 裡面我們應該怎麼處理呢?

HTTP 請求 library GOT

再說明怎麼處理 Big5 之前,先來介紹今天發 request 的主角 GOT 會使用 GOT 其實是因為 request 在 2019 年就停止維護了所以找到的替代方案,用一用覺得其實也不錯用,未來可能會開始使用這個套件吧!

那我們就先來介紹怎麼使用 got 發 request 吧!

安裝 GOT

$ npm install got

GOT 範例程式

const got = require('got');

(async () => {
	try {
		const response = await got('https://example.com/');
		console.log(response.body);
	} catch (error) {
		console.log(error.response.body);
	}
})();

使用 iconv-lite 處理 Big5 轉 UTF-8

如此 Sample 並沒有辦法處理 Big5 編碼,那如果要處理 Big5 編碼我們就需要有請 iconv-lite 來幫我們解決

安裝 iconv-lite

$ npm install iconv-lite

GOT 範例程式處理 Big5 轉換 UTF-8

就在剛剛的 sample 做一點修改就可以處理了,我們把 response.rawBody 是 big5 編碼告訴 iconv-lite 讓它幫我們轉換一下就完成拉!

const got = require('got');
const iconv = require("iconv-lite");

(async () => {
	try {
		const response = await got('https://example.com/');
		response.body = iconv.decode(Buffer.from(response.rawBody), "big5")
		console.log(response.body);
	} catch (error) {
		console.log(error.response.body);
	}
})();

不過站長目前沒有找到範例是 Big5 的伺服器可以拿來做 Demo,所以伺服器的部分就交給需要的朋友自行把 https://example.com/ 換一下囉!

參考資料