nodejs + cheerio 爬取極客學(xué)院的nodejs課程數(shù)據(jù)

文章概要

使用nodejs + cheerio 對極客學(xué)院的nodejs課程數(shù)據(jù)進(jìn)行爬取。統(tǒng)計nodejs系列課程學(xué)習(xí)總?cè)藬?shù),并記錄每個課程的課程名啥么、課程介紹往枷、鏈接地址框产、學(xué)習(xí)人數(shù)。

關(guān)于cheerio的使用错洁,請參考我的另外一篇文章 《cheerio 使用初步》

準(zhǔn)備

  • 對應(yīng)的DOM結(jié)構(gòu)如下
  • 我希望的到的是如下

      課程名稱: Node.js 異步優(yōu)化
      課程介紹:本課程作為 Node.js 進(jìn)階提升系列的第一課秉宿,主要講解 Node.js 的異步代碼編程習(xí)慣以及異步代碼編程會帶來的潛在問題。通過本課程的學(xué)習(xí)屯碴,學(xué)員將學(xué)會如何將 Node.js 的異步代碼進(jìn)行改良優(yōu)化描睦。
      課程鏈接:4510人學(xué)習(xí)
      學(xué)習(xí)人數(shù):http://www.jikexueyuan.com/course/2052.html
    

代碼 crawler.js

var http = require('http');
var cheerio = require('cheerio');
var fs = require('fs')
var url = 'http://www.jikexueyuan.com/course/nodejs/';// 要爬取的網(wǎng)址


function filterHtml(html){
    var $ = cheerio.load(html);

    var lesson_list = $('.lesson-list').find('ul').children('li');//nodejs 類型下所有課程

    //預(yù)期想抓取的每個課程結(jié)構(gòu)
    /*[{
        lesson_name: '',
        lesson_desc:'',
        lesson_num:'',
        lesson_href:''
        
    }]*/

    var nodeData = {
        lessonersNum:0,
        dataArray:[]
    };
    var lessonersTotalNum = 0;

    lesson_list.each(function(item) {
        var lesson = $(this); //獲得每個課程li


        var lesson_box = lesson.find('.lessonimg-box');
        var lesson_href = $(lesson_box.find('a')[0]).attr('href');//課程鏈接

        var lesson_infor = lesson.find('.lesson-infor');//課程詳情
        var lesson_name = $(lesson_infor.find('.lesson-info-h2').find('a')[0]).text();//課程名
        var lesson_desc = lesson_infor.find('p').text().trim();//課程介紹
        var lesson_num = lesson_infor.find('.timeandicon').find('.learn-number').text();
        lessonersTotalNum += parseInt(lesson_num);

        var lessonData = {
            lesson_name: lesson_name,
            lesson_desc:lesson_desc,
            lesson_num:lesson_num,
            lesson_href:lesson_href
        }

        nodeData.dataArray.push(lessonData)
    })
    nodeData.lessonersNum = lessonersTotalNum;

    return nodeData;
}


function printInfo(info, course) {

    var desStr = course + '系列共有: ' + info.dataArray.length + '門課程,總學(xué)習(xí)人數(shù):' + info.lessonersNum +'\r\n'
    console.log(desStr);
    fs.writeFileSync('./output.txt',desStr, {flag:'a'})

    console.log('********** 具體信息如下 **********'+ '\r\n');

    info.dataArray.forEach(function(item){
        var itemDesc = '課程名稱: ' + item.lesson_name + '\r\n' +
                       '課程介紹:' + item.lesson_desc + '\r\n' +
                       '課程鏈接:' + item.lesson_num + '\r\n' +
                       '學(xué)習(xí)人數(shù):' + item.lesson_href + '\r\n\r\n';

        console.log(itemDesc);
        fs.writeFileSync('./output.txt',itemDesc, {flag:'a'})
        
    })
}

http.get(url, function(res){
    var html = '';

    res.on('data', function(data) {
        html += data;
    })

    res.on('end', function(){

        
        var output = filterHtml(html);
        
        printInfo(output, 'nodejs')
    })

}).on('error', function() {
    console.log('出錯了')
})

拉出啦溜溜

執(zhí)行

npm install --save cheerio
node crawler.js

可以看到輸出了一個文檔output.txt同時控制臺也有相應(yīng)的內(nèi)容。這篇文章只是練練手导而,下篇文章中忱叭,我會將代碼中的回調(diào)寫法改成Promise方式,同時今艺,并發(fā)的請求其他課程的內(nèi)容韵丑,然后對Promise語法,bluebird的使用進(jìn)行展開虚缎,然后分享一些收藏的文章埂息,敬請期待吧~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市遥巴,隨后出現(xiàn)的幾起案子千康,更是在濱河造成了極大的恐慌,老刑警劉巖铲掐,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拾弃,死亡現(xiàn)場離奇詭異,居然都是意外死亡摆霉,警方通過查閱死者的電腦和手機(jī)豪椿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來携栋,“玉大人搭盾,你說我怎么就攤上這事⊥裰В” “怎么了鸯隅?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我蝌以,道長炕舵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任跟畅,我火速辦了婚禮咽筋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘徊件。我一直安慰自己奸攻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布虱痕。 她就那樣靜靜地躺著舞箍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪皆疹。 梳的紋絲不亂的頭發(fā)上疏橄,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機(jī)與錄音略就,去河邊找鬼捎迫。 笑死,一個胖子當(dāng)著我的面吹牛表牢,可吹牛的內(nèi)容都是我干的窄绒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼崔兴,長吁一口氣:“原來是場噩夢啊……” “哼彰导!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起敲茄,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤位谋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后堰燎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掏父,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年秆剪,在試婚紗的時候發(fā)現(xiàn)自己被綠了赊淑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡仅讽,死狀恐怖陶缺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情洁灵,我是刑警寧澤饱岸,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響伶贰,放射性物質(zhì)發(fā)生泄漏蛛砰。R本人自食惡果不足惜罐栈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一黍衙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荠诬,春花似錦琅翻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钧嘶,卻和暖如春棠众,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背有决。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工闸拿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人书幕。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓新荤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親台汇。 傳聞我的和親對象是個殘疾皇子苛骨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

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