nodejs使用superagent爬取網(wǎng)站內(nèi)容中文亂碼的解決方法

使用superagent爬取網(wǎng)站內(nèi)容,當網(wǎng)頁編碼不是utf-8編碼時,中文就會返回亂碼苹祟,原因是superagent只支持utf-8的網(wǎng)頁編碼,我們可以使用其擴展的一個npm模塊superagent-charset

superagent-charset使用說明

superagent-charset擴展了superagent的功能,使其可以手動指定編碼功能苔咪。

  1. 安裝
$ npm i superagent-charset
  1. 使用
    使用.charset(encoding)方法锰悼,就可以指定編碼,詳細如下:
var assert = require('assert');
var request = require('superagent-charset');
request
    .get('http://www.sohu.com/')
    .charset('gbk')
    .end(function(err,res) {
         assert(res.text.indexOf('搜狐') > -1);
  });

潛在問題

到目前為止团赏,僅僅是解決了我們?nèi)绾卧O(shè)置編碼的問題箕般,但是通常我們在爬取網(wǎng)頁的時候,都是動態(tài)爬取的舔清,也就是說并不是人工來指定網(wǎng)頁的編碼丝里,那么如何才能做到動態(tài)指定網(wǎng)頁編碼呢?可以這么來做:

  1. 動態(tài)獲取網(wǎng)站編碼
  1. 指定網(wǎng)站編碼并爬去

如何動態(tài)獲取網(wǎng)站編碼呢体谒?
為了瀏覽器能正常渲染網(wǎng)頁信息杯聚,網(wǎng)站通常都會在設(shè)置meta charset信息,如

<meta charset='utf-8'>

或者

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

我們可以寫一個正則匹配規(guī)則抒痒,來匹配這段信息中的charset內(nèi)容來獲取編碼幌绍,如下:

var charset = "utf-8";
var arr = res.text.match(/<meta([^>]*?)>/g);
if (arr) {
    arr.forEach(function (val) {
        var match = val.match(/charset\s*=\s*(.+)\"/);
        if (match && match[1]) {
            if (match[1].substr(0, 1) == '"')match[1] = match[1].substr(1);
            charset = match[1].trim();
        }
    })
}

當然,前提是我們需要將網(wǎng)頁先爬下來故响。完整的代碼如下:

parseUrl: function (url, callback) {
    async.waterfall([
            function (callback) {   // 動態(tài)獲取網(wǎng)站編碼
                superagent.get(url).end(function (err, res) {
                    var charset = "utf-8";
                    var arr = res.text.match(/<meta([^>]*?)>/g);
                    if (arr) {
                        arr.forEach(function (val) {
                            var match = val.match(/charset\s*=\s*(.+)\"/);
                            if (match && match[1]) {
                                if (match[1].substr(0, 1) == '"')match[1] = match[1].substr(1);
                                charset = match[1].trim();
                            }
                        })
                    }
                    callback(err, charset)
                })
            }, function (charset, callback) {   // 內(nèi)容爬取
                superagent
                    .get(url)
                    .charset(charset)
                    .end(function (err, res) {
                        if (err) {
                            console.log(err);
                            callback(err);
                            return;
                        }
                        var model = {};
                        var $ = cheerio.load(res.text);
                        var title = _.trim($('title').text());
                        if (title.indexOf('-') > 0) {
                            var strs = _.split(title, '-');
                            model.title = _.trim(title.substr(0, title.lastIndexOf('-')));
                            model.source = _.trim(_.last(strs));
                        } else {
                            model.title = _.trim(title);
                        }
                        callback(err, model);
                    })
            }
        ],
        function (err, model) {
            callback(err, model);
        });
}

整體思路:

  1. 現(xiàn)將網(wǎng)頁內(nèi)容爬下來傀广,動態(tài)獲取編碼
  2. 再用得到的編碼再爬一次。

所以彩届,弊端就是:同一個頁面要爬兩次伪冰!同一個頁面要爬兩次!同一個頁面要爬兩次樟蠕!

謹慎使用贮聂!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市寨辩,隨后出現(xiàn)的幾起案子吓懈,更是在濱河造成了極大的恐慌,老刑警劉巖靡狞,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骄瓣,死亡現(xiàn)場離奇詭異,居然都是意外死亡耍攘,警方通過查閱死者的電腦和手機榕栏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蕾各,“玉大人扒磁,你說我怎么就攤上這事∈角” “怎么了妨托?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵缸榛,是天一觀的道長。 經(jīng)常有香客問我兰伤,道長内颗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任敦腔,我火速辦了婚禮均澳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘符衔。我一直安慰自己找前,他們只是感情好,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布判族。 她就那樣靜靜地躺著躺盛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪形帮。 梳的紋絲不亂的頭發(fā)上槽惫,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天,我揣著相機與錄音辩撑,去河邊找鬼界斜。 笑死,一個胖子當著我的面吹牛槐臀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播氓仲,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼水慨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了敬扛?” 一聲冷哼從身側(cè)響起晰洒,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎啥箭,沒想到半個月后谍珊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡急侥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年砌滞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坏怪。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡贝润,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铝宵,到底是詐尸還是另有隱情打掘,我是刑警寧澤华畏,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站尊蚁,受9級特大地震影響亡笑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜横朋,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一仑乌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叶撒,春花似錦绝骚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至古瓤,卻和暖如春止剖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背落君。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工穿香, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绎速。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓皮获,卻偏偏與公主長得像,于是被迫代替她去往敵國和親纹冤。 傳聞我的和親對象是個殘疾皇子洒宝,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,297評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)萌京,斷路器雁歌,智...
    卡卡羅2017閱讀 134,702評論 18 139
  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測試 ...
    KeKeMars閱讀 6,340評論 0 6
  • Node基本 node的最大特性莫過于基于事件驅(qū)動的非阻塞I/O模型。 node通過事件驅(qū)動的方式處理請求知残,無須為...
    AkaTBS閱讀 2,176評論 0 11
  • 第二章 不是他 “你在哪個房間幾床翱肯埂?” 聽著手機里焦急的聲音求妹,我淡淡苦笑著乏盐。一番爭吵后的N天,這個轉(zhuǎn)身摔了車...
    淳_7d93閱讀 225評論 0 2