Node.js抓取網(wǎng)站中文亂碼解決辦法
問題:Node.js抓取網(wǎng)站中文亂碼
async function getHtml(){ let res = await axios.get(publicPath+"/pic/") console.log(res) }
如上代碼,axios默認(rèn)是以u(píng)tf8的方式去解碼html
由于原網(wǎng)頁(yè)的編碼方式是gb2312
控制臺(tái)打印中文亂碼
_G?????_????????</b></a> </h3>\r\n' + '<p> ???????????????????????????????裬?????????????????G??????????????????????????????????? ????????? ??????????Σ??????????Щ???????????????????????????????????????????????... </p>\r\n' + `<span class="spanimg1">????
Node.js抓取網(wǎng)站中文亂碼解決辦法
stream嘗試了很多種方式都無(wú)效,最后想到流請(qǐng)求
我們以流的方式去請(qǐng)求網(wǎng)頁(yè),因?yàn)榱鞫际嵌M(jìn)制數(shù)據(jù),當(dāng)我們獲取到所有的二進(jìn)制數(shù)據(jù)后,將其以原網(wǎng)頁(yè)的編碼方式去解碼即可!
步驟
1.引入 iconv-litenpm i iconv-lite
const axios = require('axios') const cheerio = require('cheerio') const iconv = require('iconv-lite') //封裝請(qǐng)求html方法 async function getHtml(url){ let res = await axios.get( url,{ responseType: 'stream' }) return new Promise(resolve=>{ let chunks = [] res.data.on('data',chunk=>{ chunks.push(chunk) }) res.data.on('end',()=>{ let buffer = Buffer.concat(chunks) let str = iconv.decode(buffer,'gb2312') resolve(str) }) }) }
getHtml用于發(fā)送流請(qǐng)求
在函數(shù)內(nèi)部封裝了promise,
promise里面的res.data
是一個(gè)可讀流當(dāng)獲取到流數(shù)據(jù)時(shí),我們及將其添加到chunks數(shù)組。
流數(shù)據(jù)獲取完畢后,將二進(jìn)制數(shù)據(jù)連接,并設(shè)置解碼方式為gb2312
最好用cheerio封裝一下
async function getData(){ const html = await getHtml(publicPath+"/pic/") const $ = cheerio.load(html) console.log($.html()) } getData()
解碼后的數(shù)據(jù)
七里香》吉他譜,周杰倫的經(jīng)典代表作品,七里香吉他六線譜,原調(diào)bE選調(diào)C,CAPO夾三品,完整版共五張彈唱圖 片譜。感謝老姚吉他編配,并同步《七里香》吉他彈唱教學(xué)視頻,琴友們可以跟隨老師的示范講解練習(xí)起來(lái)。 曲... </p> <span class="spanimg1">分類: <a href="/geshou/Cdiaodanchangpu_1258_1.html" rel="external nofollow" target="_blank">C調(diào)彈唱譜</a> <a href="/geshou/jitajiaoxueshipin_5348_1.html" rel="external nofollow" target="_blank">吉他教學(xué)視頻</a> </span> <span class="spanimg2">來(lái)源:未知 </span> <span class="spanimg3">2020-12-25</span>
以上就是Node.js抓取網(wǎng)站中文亂碼解決辦法的詳細(xì)內(nèi)容,更多關(guān)于Node.js抓取網(wǎng)站中文亂碼解決辦法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解如何在Node.js的httpServer中接收前端發(fā)送的arraybuffer數(shù)據(jù)
這篇文章主要介紹了詳解如何在Node.js的httpServer中接收前端發(fā)送的arraybuffer數(shù)據(jù),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2018-11-11Node.js API詳解之 string_decoder用法實(shí)例分析
這篇文章主要介紹了Node.js API詳解之 string_decoder用法,結(jié)合實(shí)例形式分析了Node.js API中string_decoder的功能、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-04-04深入了解 Node的多進(jìn)程服務(wù)實(shí)現(xiàn)
本文主要介紹了Node的多進(jìn)程服務(wù)實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06node封裝一個(gè)控制臺(tái)進(jìn)度條插件???????詳情
這篇文章主要介紹了node封裝一個(gè)控制臺(tái)進(jìn)度條插件???????詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08node.js事件循環(huán)機(jī)制及與js區(qū)別詳解
這篇文章主要為大家介紹了node.js事件循環(huán)機(jī)制及與js區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Node.js 使用 gRPC從定義到實(shí)現(xiàn)過程詳解
gRPC是一個(gè)高性能、開源的遠(yuǎn)程過程調(diào)用(RPC)框架,由 Google 開發(fā),它支持多種編程語(yǔ)言,旨在簡(jiǎn)化和優(yōu)化分布式系統(tǒng)中的服務(wù)通信,本文給大家介紹Node.js 使用 gRPC從定義到實(shí)現(xiàn)過程,感興趣的朋友跟隨小編一起看看吧2024-07-07