nodejs + cheerio 爬取极客学院的nodejs课程数据

文章概要

使用nodejs + cheerio 对极客学院的nodejs课程数据进行爬取。统计nodejs系列课程学习总人数,并记录每个课程的课程名、课程介绍、链接地址、学习人数。

关于cheerio的使用,请参考我的另外一篇文章 《cheerio 使用初步》

准备

  • 要爬取的页面
nodejs + cheerio 爬取极客学院的nodejs课程数据_第1张图片
  • 对应的DOM结构如下
nodejs + cheerio 爬取极客学院的nodejs课程数据_第2张图片
  • 我希望的到的是如下

      课程名称: 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的使用进行展开,然后分享一些收藏的文章,敬请期待吧~

你可能感兴趣的:(nodejs + cheerio 爬取极客学院的nodejs课程数据)