基于Nodejs的第一个小爬虫

来源:互联网 发布:淘宝拍卖商业房产税费 编辑:程序博客网 时间:2024/05/17 09:13

最近跟着慕课网的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);    })})

0 0
原创粉丝点击