nodejs + cheerio 爬取極客學院的nodejs課程數據

文章概要

使用nodejs + cheerio 對極客學院的nodejs課程數據進行爬取。統計nodejs系列課程學習總人數,並記錄每一個課程的課程名、課程介紹、連接地址、學習人數。html

關於cheerio的使用,請參考個人另一篇文章 《cheerio 使用初步》node

準備

  • 對應的DOM結構以下

  • 我但願的到的是以下npm

    課程名稱: Node.js 異步優化
      課程介紹:本課程做爲 Node.js 進階提高系列的第一課,主要講解 Node.js 的異步代碼編程習慣以及異步代碼編程會帶來的潛在問題。經過本課程的學習,學員將學會如何將 Node.js 的異步代碼進行改良優化。
      課程連接:4510人學習
      學習人數: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/';// 要爬取的網址


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

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

    //預期想抓取的每一個課程結構
    /*[{
        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 + '門課程,總學習人數:' + 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' +
                       '學習人數:' + 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('出錯了')
})
複製代碼

拉出啦溜溜

執行併發

npm install --save cheerio
node crawler.js
複製代碼

能夠看到輸出了一個文檔output.txt同時控制檯也有相應的內容。這篇文章只是練練手,下篇文章中,我會將代碼中的回調寫法改爲Promise方式,同時,併發的請求其餘課程的內容,而後對Promise語法,bluebird的使用進行展開,而後分享一些收藏的文章,敬請期待吧~less

相關文章
相關標籤/搜索