zoukankan      html  css  js  c++  java
  • 仿教程 小爬虫抓取imooc数据

    慕课网的nodejs教程:http://www.imooc.com/learn/348

    这人讲的很赞,特别是在事件驱动这点上,耳目一新。

    视频略老,所以demo有些过时了,摸索着写了一个自己的小程序。

    比较痛苦的是最近半年几乎没写过jQuery,不少用法实在想不起来,好在翻着API也不是什么问题。

    首先,npm install cheerio,可以认为cheerio这货就是nodejs版本的jQuery,用法应该完全一致。

    然后就可以愉快的敲代码了:

    var http = require('http')
    var cheerio = require('cheerio')
    
    var url = 'http://www.imooc.com/learn/348'
    
    function filterChapters(html) {
        var $ = cheerio.load(html)
    
        var chapters = $('div.chapter')
    
        var courseData = []
    
        chapters.each(function () {
            var chapter=$(this) // $(this)的用法可以让回调方法省略参数
            // var chapterTitle = chapter.find('strong').text().trim()
            var chapterTitle = chapter.find('strong').contents().filter(function() { return this.nodeType === 3; }).text().trim(); 
            var videos=chapter.find('ul').children()
    
            var chapterData = { // 定义一个json以接收数据
                chapterTitle : chapterTitle,
                videos:[]
            }
    
            videos.each(function () {
                var video=$(this).find('a')
                var temp=video.text().trim()
                // var temp=video.contents().filter(function() { return this.nodeType === 3; }).text().trim(); 
                var arr = temp.split('
    ') // 多层标签的文本都拼到一起了,要拆开,取用需要的值
                var videoTitle = arr[0].trim() + ' ' +arr[1].trim()
                var id=video.attr('href').split('video/')[1].trim()
    
                chapterData.videos.push({ // 填写数据 
                    title : videoTitle,
                    id : id
                })
            })
    
            courseData.push(chapterData)
        })
    
        return courseData
    }
    
    // 输出函数 
    function printCourseData(courseData) {
        courseData.forEach(function (item) {
            var chapterTitle = item.chapterTitle
    
            console.log(chapterTitle )
    
            item.videos.forEach(function (video) {
                console.log('---【'+video.id + '】 ' + video.title.trim() )
            })
        })
    }
    // 拿到源码,调用方法进行解析及输出
    http.get(url, function(res){
        var html = ''
    
        res.on('data', function (data) {
            html+=data
        })
    
        res.on('end',function(){
            var courseData = filterChapters(html)
            printCourseData(courseData)
        })
    }).on('error', function () {
        console.log('获取课程数据出错了')
    })
  • 相关阅读:
    SQL中的escape 将通配符 变成普通符号
    shell 变量
    vi 常用命令
    Java 内存模型基础
    Linux 的文件权限与目录配置
    Mybatis 源码分析之事物管理
    Mybatis 源码分析之一二级缓存
    Mybatis源码分析之结果集处理
    从JDBC看Mybatis的设计
    Mybatis源码分析之插件的原理
  • 原文地址:https://www.cnblogs.com/larryzeal/p/5988430.html
Copyright © 2011-2022 走看看