摘要:這樣嘗試了之后,網(wǎng)頁中文編碼的問題會解決大部分,但是有的地方還是存在中文亂碼這樣的問題主要是我在進(jìn)行了轉(zhuǎn)碼成之后沒有將新插入后的頁面轉(zhuǎn)碼到初始狀態(tài),一旦被瀏覽器下載之后瀏覽器會無法識別部分的編碼從而導(dǎo)致一部分編碼。
最近做開發(fā)有一個需求需要用cheerio抓取一個網(wǎng)頁,然后將一段js腳本插入到
標(biāo)簽的末尾。然后還要保證瀏覽器運(yùn)行正?!,F(xiàn)在把這些遇見過的問題記錄一下。Node.js默認(rèn)是不支持utf-8編碼的,所以抓取非 utf-8 的中文網(wǎng)頁時會出現(xiàn)亂碼問題,比如網(wǎng)易的首頁編碼是 gb2312,抓取時會出現(xiàn)亂碼,百度下眾大佬們的看法都是使用icon-lite 進(jìn)行轉(zhuǎn)碼(有興趣可以自行百度cheerio中文亂碼)。(只是他們說的情況跟我這邊還不太一樣。我需要將網(wǎng)頁返還給瀏覽器)。然后我就開始動手試了一下。思路大概是這樣的:獲取代理層將請求回來的html請求頭header中的content-type 來判斷這個網(wǎng)頁的編碼方式。然后使用iconv.decode將其進(jìn)行相應(yīng)的轉(zhuǎn)碼然后在做js替換。但是這樣的話是有漏洞的,如下圖
有的網(wǎng)站開發(fā)規(guī)范性不夠甚至在content-type 連網(wǎng)頁的編碼方式都不去聲明。所以這條路是不通的只能通過抓取標(biāo)簽來確定網(wǎng)頁相應(yīng)的編碼進(jìn)而轉(zhuǎn)碼。
var newDataStr = ""; var charset="utf-8"; var arr=responseDetail.response.body.toString().match(/]*?)>/g); if(arr){ arr.forEach(function(val){ var match=val.match(/charsets*=s*(.+)"/); if(match && match[1]){ if(match[1].substr(0,1)==""")match[1]=match[1].substr(1); charset=match[1].trim(); return false; } }) } var html = iconv.decode(responseDetail.response.body, charset); // var html = responseDetail.response.body.toString(); var $ = cheerio.load(html); responseDetail.response.body = newDataStr; return {response: responseDetail.response}
這樣嘗試了之后,網(wǎng)頁中文編碼的問題會解決大部分,但是有的地方還是存在中文亂碼
這樣的問題主要是我在node進(jìn)行了轉(zhuǎn)碼成gbk之后沒有將新插入后的頁面轉(zhuǎn)碼到初始狀態(tài),一旦被瀏覽器下載之后瀏覽器會無法識別部分js xhr的編碼從而導(dǎo)致一部分編碼。所以
newDataStr=iconv.encode($.html(), charset); 將其返回到最初的編碼方式就可以了
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/88979.html
摘要:爬蟲介紹二爬蟲的分類通用網(wǎng)絡(luò)爬蟲全網(wǎng)爬蟲爬行對象從一些種子擴(kuò)充到整個,主要為門戶站點(diǎn)搜索引擎和大型服務(wù)提供商采集數(shù)據(jù)。 分分鐘教你用node.js寫個爬蟲 寫在前面 十分感謝大家的點(diǎn)贊和關(guān)注。其實,這是我第一次在segmentfault上寫文章。因為我也是前段時間偶然之間才開始了解和學(xué)習(xí)爬蟲,而且學(xué)習(xí)node的時間也不是很長。雖然用node做過一些后端的項目,但其實在node和爬蟲方面...
摘要:一前言一直感覺爬蟲是個挺高端的東西大數(shù)據(jù)時代爬蟲顯得尤為重要。 一、前言 一直感覺爬蟲是個挺高端的東西 大數(shù)據(jù)時代 爬蟲顯得尤為重要。經(jīng)過一番探索,終于用node實現(xiàn)了這個功能,還包括對抓取內(nèi)容的解析 二、正文 1、首先搭建一個http服務(wù),這里使用我們熟悉的koa(這個是非必須的 你也可以使用純node去抓 這里主要為了方便交互、看效果或者給非技術(shù)人員使用方便)服務(wù)端 index.j...
摘要:使用抓取網(wǎng)頁圖片的使用非常廣泛,可以做通信,做爬蟲,甚至可以做桌面應(yīng)用程序。今天就利用閑暇時間寫個小小的分享利用爬取百度圖片首頁的圖片。 使用 node 抓取網(wǎng)頁圖片 node 的使用非常廣泛,可以做通信,做爬蟲,甚至可以做桌面應(yīng)用程序。 今天就利用閑暇時間寫個小小的分享:利用 node 爬取百度圖片首頁的圖片。 對,就是中間那幾張: showImg(https://segmentfa...
摘要:接著上篇爬蟲抓取豆瓣電影網(wǎng)頁數(shù)據(jù)上本篇主要描述將上次抓取的數(shù)據(jù)存入數(shù)據(jù)庫前提百度或谷歌的安裝教程,安裝本地并成功運(yùn)行推薦一款數(shù)據(jù)庫可視化管理工具。 接著上篇 Nodejs爬蟲--抓取豆瓣電影網(wǎng)頁數(shù)據(jù)(上) 本篇主要描述將上次抓取的數(shù)據(jù)存入mongodb數(shù)據(jù)庫 前提:百度或谷歌mongodb的安裝教程,安裝本地并成功運(yùn)行 推薦一款mongodb數(shù)據(jù)庫可視化管理工具:Robomongo...
摘要:接著上篇爬蟲抓取豆瓣電影網(wǎng)頁數(shù)據(jù)上本篇主要描述將上次抓取的數(shù)據(jù)存入數(shù)據(jù)庫前提百度或谷歌的安裝教程,安裝本地并成功運(yùn)行推薦一款數(shù)據(jù)庫可視化管理工具。 接著上篇 Nodejs爬蟲--抓取豆瓣電影網(wǎng)頁數(shù)據(jù)(上) 本篇主要描述將上次抓取的數(shù)據(jù)存入mongodb數(shù)據(jù)庫 前提:百度或谷歌mongodb的安裝教程,安裝本地并成功運(yùn)行 推薦一款mongodb數(shù)據(jù)庫可視化管理工具:Robomongo...
閱讀 4846·2021-09-22 16:06
閱讀 2150·2021-09-22 15:22
閱讀 1492·2019-08-30 15:54
閱讀 2570·2019-08-30 15:44
閱讀 2405·2019-08-29 16:31
閱讀 2068·2019-08-29 16:26
閱讀 2397·2019-08-29 12:41
閱讀 805·2019-08-29 12:22