zoukankan      html  css  js  c++  java
  • nodejs http小爬虫

    本课程用nodejs写一个http小爬虫,首先科普一下,爬虫就是把网上的网页代码给弄下来,然后纳为己用。目前最大的爬虫:百度快照等的。

    下面直接上代码

    示例一:

    
    var http = require('http');
    var url = "http://www.imooc.com/learn/348";
    http.get(url, function(res) {
    var html = '';  //http get去请求url ,url是慕课网
    res.on('data', function(data) {
    html += data; //请求数据赋值给前面定义的html
    });
    res.on('end', function() {
    console.log(html); //结束后打印出html
    });
    }).on('error', function() {
    conslole.log('请求出错');//出错打印
    });
    
    

    保存imooc-crawler.js,然后运行:node imooc-crawler.js , 注意路径。

    文件下载 imooc-crawler.js右击另存

    最后结果可是打印了满满的窗口啊,就不上图了。

    示例二:

    首先要安装一下小插件,cheerio , 该插件就是node里面的jquery,api地址点击这里http://www.imlwj.com/blog/?p=39

    安装cheerio,在控制台输入命令:npm install cheerio  等待一会儿。

    首先来看看http://www.imooc.com/learn/348的dom结构

    QQ截图20150803160021

    var http = require('http');
    var cheerio=require('cheerio');//引用安装成功的cheerio
    var url = "http://www.imooc.com/learn/348";

    //过滤方法

    
    function filterChapters(html){
    var $=cheerio.load(html);
    var chapters=$('.learnchapter');//和jquery 里面的方法一样,直接得到目录块,通过learnchapter类获取
    // [{
    // chapterTitle:'',
    // videos:[
    // title:'',
    // id:''
    // ]
    // }]
    var courseData=[];//定义一个数组,用来存储一级目录标题和二级目录标题以及二级目录的id
    chapters.each(function(item){
    var chapter=$(this);
    var chapterTitle=chapter.find('strong').text();//一级目录表示是放在一个strong标签里面的,所以轻易的就可以拿到
    var videos=chapter.find('.video').children('li');//拿到二级目录块
    var chapterData={//一级目录里面包括它本身的标题,还包括二级目录的标题和二级目录id,所以二级目录也定义成数组
    chapterTitle:chapterTitle,
    videos:[]
    };
    videos.each(function(item){
    var video=$(this).find('.studyvideo');//获取二级目录标题所在的a标签
    var videoTitle=video.text();//得到二级目录标题
    var id=video.attr('href').split('video/')[1];//获取a标签的href属性值,然后进行分割,获取id值,以‘' video/ ’分割,取第二部分,数组的下标是从0开始,所以是[1]
    chapterData.videos.push({//数组push值,加入二级标题,二级id
    title:videoTitle,
    id:id
    });
    });
    courseData.push(chapterData);//对我们需要的内容数组push值
    });
    return courseData;//把过滤结果返回
    }
    
    function printCourseInfo(courseData){
    courseData.forEach(function(item){//遍历数组
    var chapterTitle=item.chapterTitle;//获取一级标题
    console.log(chapterTitle+'
    ');//打印一级标题
    item.videos.forEach(function(video){ //二级目录也是数组,同样要遍历
    console.log(' ['+video.id+'] '+video.title+'
    ');//打印二级标题和id
    });
    });
    }
    
    http.get(url, function(res) {
    var html = '';
    res.on('data', function(data) {
    html += data;
    });
    res.on('end', function() {
    var courseData=filterChapters(html);//对示例一的html进行过滤,过滤出我们需要的内容
    printCourseInfo(courseData);//打印出过滤后的内容
    });
    }).on('error', function() {
    console.log('请求出错');
    });
    
    

    保存crawler.js,然后运行:node crawler.js , 注意路径。

    文件下载 crawler.js右击另存

    下图是打印结果

    QQ截图20150803161146

    视频是慕课网:http://www.imooc.com/learn/348

    个人总结:本课程的主要还是在于对jquery的学习,这里也就是对cheerio的学习,能够熟练的操作dom,其他都没有啥问题了。

    cheerio学习地址http://www.imlwj.com/blog/?p=39

    转载本站文章请注明出处:爱开发 http://www.imlwj.com/blog/?p=41

  • 相关阅读:
    PHP获取一周的日期
    关系型数据库和非关系型数据库的区别和特点
    关系型数据库和非关系型数据库的特性以及各自的优缺点
    什么是数据库?什么是关系数据库?什么是非关系型数据库?
    PHP中把对象转数组的几个方法
    验证银行卡号
    xss过滤方法
    PHP 随机字符
    计算两个日期相差年月日
    判断一个时间段是否包含周末
  • 原文地址:https://www.cnblogs.com/haimishasha/p/4941232.html
Copyright © 2011-2022 走看看