基于Nodejs的第一个小爬虫

最近跟着慕课网的Scott老师课程写了个小爬虫,爬取当前学习课程的课程列表信息,由于当前该页面的源码修改过了不再是视频中的那个源码了,所以按照老师的代码是爬取不了的,对于爬取修改的这部分就苦搞了一个下午才搞定(毕竟自己学的javascript很渣....)。给我很大惊喜的是使用Nodejs来写爬虫,不再需要用正则表达式这个恶心的东西了来爬取自己想要的数据,使用Nodejs中的cheerio模块(用法和jquery几乎一样)来选择自己需要爬取的标签数据就相当于用javascript中使用jquery来选择当前页面的标签数据,实现起来相当简单;下面直接来看代码:

/**
 * Created by Turne on 2017/2/10.
 */

var http = require('http');
var url = 'http://www.imooc.com/learn/348';//当前需要爬取的url地址
var cheerio = require('cheerio');//cheerio模块使用方法几乎和jquery一样

function printinfo(coureData) {//打印已经爬好的数据
    coureData.forEach(function (item) {
        console.log(item.chapterTitle + '\n');//打印每一章的标题

        item.videos.forEach(function (video) {
            console.log(' 【' + video.id + '】 '+ video.title + '\n');//打印每个视频的id和小标题
        })
    })
}

function selecttHtml(html) {//选择自己需要爬取该页面中的那些数据
    var $ = cheerio.load(html);//解析HTML代码
    var contents = $('.chapter');//选择类名为chapter的所有标签

    var courseData = [];

    contents.each(function (item) {
        var content = $(this);
        var text = content.find('.chapter-content').text();
        var chapterTitle = content.find('strong').text().split(text)[0].trim();//当前章节的标题
        var videos = content.find('.video').children('li');//所有视频的信息

        var chapterData = {//每一章数据保存的对象格式
            chapterTitle:chapterTitle,
            videos: []
        };

        videos.each(function (item) {
            var video = $(this).find('a');
            var title = video.text().split('开始学习')[0].trim();
            //console.log(title.length);
            title = title.substring(0,title.length - 10).trim() + " " + title.substring(title.length - 10,title.length).trim();
            var id = video.attr('href').split('video/')[1];

            chapterData.videos.push({
                title:title,//每个视频的标题
                id:id//每个视频的id
            })

        })

        courseData.push(chapterData)
    })
    return courseData;
}

http.get(url,function(res){//获取url地址的源码
    var html = '';

    res.on('data',function (data) {//当触发data事件时,就把当前返回的数据保存起来
        html += data.toString('utf-8');
    })
    res.on('end',function(){//当触发end事件时,即响应已结束,即整个源码都已获取成功了
        //console.log(html);
        var courseData = selecttHtml(html);
        printinfo(courseData);
    })

})

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值