form1.cn
Make a little progress every day

node.js写的小爬虫程序,Scott老师教的

08th of January 2018 Javascript Node.js 2477

最近在学习node.js,在imooc网学习,Scott老师讲怎么样用node.js爬imooc网络的课程,下面是实现代码:

var http = require('http');
var cheerio = require('cheerio');//处理获取的html模块
var url = 'http://www.imooc.com/learn/348';

/**
* 处理获取到的html代码*/
function setHtml(html) {
    var $ = cheerio.load(html);//加开获取的字符串的html
    var chapters = $('.chapter');//就像jquery一样,操控class获取DOM
    var courseData = [];
    chapters.each(function (item) {//chapters这个class被获取到了多个,这里要each每一个
        var chapterstitle = $(this).find('strong').text().split('\n')[2];//拿到章标题
        var video = $(this).find('.video').children('li');//获取小节可 循环 部分
        var chapterData = {
            chapterstitle:trim(chapterstitle),
            videos:[]
        };
        video.each(function (items) {
            var setAhref = $(this).find('.J-media-item');
            var childTitle = setAhref.text().replace(/\n/g,'').replace(/\r/,'').replace(/开始学习/,'');
            var childId = setAhref.attr('href').split('video/')[1];
            chapterData.videos.push({// push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。
                childTitle:trim(childTitle),
                childId:childId
            });
        });
        courseData.push(chapterData);
        //console.log(chapterstitle+'\n');
    });
    return courseData;
}

/**
 * 遍历处理后的数组并打印*/
function foreach(resultHtml) {
    resultHtml.forEach(function (item,index) {
        console.log('=='+item.chapterstitle+'\n');
        item.videos.forEach(function (item1,index) {
            console.log('---['+item1.childId+']-'+item1.childTitle+'\n');
        })
    });
}

//去掉字符串中所有空白;
function trim(str) {
    var result = str.replace(/\s/g,"");
    return result;
}

//http的get请求
http.get(url,function (res) {
    var html = '';
    res.on('data',function (data) {//返回数据流,会获取不定次,将每次的累加得到所有html代码
        html += data;
    });
    res.on('end',function () {//请求完成事件
        var resultHtml = setHtml(html);//处理html并返回处理结果
        foreach(resultHtml);//循环数组,显示列表
        //console.log(resultHtml);
    });
}).on('error',function () {
    console.log('请求错误或地址不正确!');
});


执行结果:

==第1章前言

---[6687]-1-1Node.js基础-前言(01:20)

---[6688]-1-2为什么学习Nodejs(05:43)

==第2章安装Nodejs

---[6689]-2-1Node.js基础-课程简介(01:19)

---[6690]-2-2Nodejs版本常识(01:02)

---[6691]-2-3Windows下安装Nodejs(04:43)

---[6692]-2-4Linux下安装Nodejs(06:24)

---[6693]-2-5Mac下安装Nodejs(03:55)
......