资讯专栏INFORMATION COLUMN

性感慕课-在线被爬

刘德刚 / 1333人阅读

摘要:刚开始写的时候我把声明在了全局,以至于返回成下面这组数据爬取课程详情页的信息在我们有了所有课程详情页的后,我们开始爬取里面的内容。

引言

在学习了 alsotang 大神的 《Node.js包教不包会》后的一个爬虫小练习,期间也碰到挺多小问题,也学到了很多小东西。「单押×3」

这里是大神的教程地址 https://github.com/alsotang/node-lessons,

下面是自己的爬取效果图

)

同时推荐一个谷歌插件 JSONView,会将 JSON 格式的数据转化成上面图的格式

imoocSpider练习源码

搭建服务器

首先,搭建一个 http 服务

var http = require("http");
var express = require("express");

var app = express();

http.createServer(app).listen(8080);

app.get("/", function(req, res) {
  //code here...
})

用的是 express 搭建的,当然也可以用原生的,在这里自己比较习惯用 express

在线爬虫

在这里用到的是 superagentcheerio 来爬取页面,这里有相关文档可以参考: superagent中文文档、cheerio,都是来自 cnode 社区,当然英语能力较好的也可以参考原文档。在这里就只贴出这两个

爬取页面链接 https://www.imooc.com/course/...

我们是要爬取慕课网前端开发八个页面的课程中的一些信息,但是打开此链接发现每个页面只有课程的名称,并没有老师的名称和一些课程的主要信息。因此我们还需要获取并根据每个课程的 url 进行爬取。

获取课程详情页链接

那我们先来爬取八个页面的所有课程详情页的 url

通过点击对应页面的按钮,发现每次都会发送一个新的 get 请求,请求的链接就是对应的页面,而这里的链接只有 page 属性是不同的,因此我们通过动态改变 page 就可以模拟点击对应页来获取对应页的信息

var pages = 1;
var baseUrl = "https://www.imooc.com/course/list/";

var params = {
  c: "fe",
  page: page
};

superagent
  .get(baseUrl)
  .query(params)
  .end(function(err, content) {
    var topicUrls = [];
    var $ = cheerio.load(content.text);
    var courseCard = $(".course-card-container");
    courseCard.each(function(index, element) {
      var $element = $(element);
      var href = url.resolve(
        homeUrl,
        $element.find(".course-card").attr("href")
      );

      topicUrls.push(href);
    });
    console.log(topicUrls);
  });

这样就可以获取到了第一个页面的 25 个课程的详情页的 url,那要如何获取八个页面呢。

async

因为有些网站通常都会有安全限制,不会允许同一个域名有过大的高并发数,因此需要限制并发数,在这里用我们用到了 async 这个库。这里是其 github

我们首先把前面代码封装成一个函数

var baseUrl = "https://www.imooc.com/course/list/";
var fetchUrl = function(page, callback) {
    count++;
    console.log("当前并发数", count);

    var params = {
      c: "fe",
      page: page
    };

    superagent
      .get(baseUrl)
      .query(params)
      .end(function(err, content) {
        var topicUrls = [];
        var $ = cheerio.load(content.text);
        var courseCard = $(".course-card-container");
        courseCard.each(function(index, element) {
          var $element = $(element);
          var href = url.resolve(
            homeUrl,
            $element.find(".course-card").attr("href")
          );

          topicUrls.push(href);
        });

        callback(err, topicUrls);
        count--;
        console.log("释放并发数后当前并发数", count);
        
      });
  };

然后用 async 控制并发数和八个页面的抓取

var pages = [1, 2, 3, 4, 5, 6, 7, 8];
async.mapLimit(
    pages, 
    5,
    function(page, callback) {
      fetchUrl(page, callback);
    },
    function(err, result) {
      if (err) console.log(err);

      console.log(result)
    }
  );
});

这样所有的 url 就被打印出来,这里要注意一下,async 会自动把第三个函数参数的返回值合并成一个数组给第四个函数参数的 result 参数。刚开始写的时候我把 topicUrls 声明在了全局,以至于返回成下面这组数据

爬取课程详情页的信息

在我们有了所有课程详情页的 url 后,我们开始爬取里面的内容。首先定义一个函数

var fetchMsg = function(topicUrl, callback) {
    console.log("开启新一轮抓取")
    superagent
      .get(topicUrl)
      .end(function(err, content){
        var Item = [];
        var $ = cheerio.load(content.text);
        var title = $(".hd .l").text().trim();//课程名字
        var teacher = $(".tit a").text().trim();//老师名字
        var level = $(".meta-value").eq(0).text().trim();//难度
        var time = $(".meta-value").eq(1).text().trim();//时长
        var grade = $(".meta-value").eq(3).text().trim();//评分

        Item.push({
          title: title,
          teacher: teacher,
          level: level,
          time: time,
          grade: grade,
          href: topicUrl
        })


        callback(null, Item);
      })
  };

然后用 async 控制并发爬取

//result 为上文中的 result,下面的代码也都是在上文中的第四个参数中

var topicUrls = result; //获取所有 url ,但是大数组里面有 8 个小数组

var Urls = [];
//将大数组合并
for(let i=0,l=topicUrls.length;i

这里要注意一个小问题,就是 result 获取到的 url 结构是一个大数组里面包含八个小数组,因此需要将其小数组先合并成一个大数组。

最后

项目源码

原文地址

每天探索一点点,每天进步一点点。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/95057.html

相关文章

  • 用户隐私数据是怎么泄露的?揭秘黑客的惯用手段——《Robots协议漏洞详解》(建议收藏)

    摘要:二协议简介什么是协议协议全称是,翻译成中文就是网络爬虫排除协议,别名爬虫协议,机器人协议等。协议代表一种网站的根目录契约精神,所有网站都应该遵守这一约定,以保证网站以及用户的隐私数据不被泄露。 ...

    ghnor 评论0 收藏0
  • 慕课网_《如何使用高德云图在线制作属于你的地图》学习总结

    摘要:时间年月日星期日说明本文部分内容均来自慕课网。用户可以在服务器端调用云存储云检索从而构建自己的存储和检索服务,甚至可以制作自己的数据管理台。 时间:2017年08月13日星期日说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:无学习源码:https://github.com/zccodere/s... 第一章:云图产品介绍 1-1 云图产品介绍...

    k00baa 评论0 收藏0
  • 慕课网_《如何使用高德云图在线制作属于你的地图》学习总结

    摘要:时间年月日星期日说明本文部分内容均来自慕课网。用户可以在服务器端调用云存储云检索从而构建自己的存储和检索服务,甚至可以制作自己的数据管理台。 时间:2017年08月13日星期日说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:无学习源码:https://github.com/zccodere/s... 第一章:云图产品介绍 1-1 云图产品介绍...

    afishhhhh 评论0 收藏0
  • 性感与色情有多远——你不知道的图片鉴黄那些事

    摘要:得益于今年来计算机速度的提升大规模集群技术的兴起的应用以及众多优化算法的出现,耗时数月的训练过程可缩短为数天甚至数小时,机器学习可以被广泛运用,大大提升鉴黄效率。 图片鉴黄服务市场容量巨大,作为移动互联网行业最为热门的创业领域,移动社交类App每天生产大量图片,并有无数色情图片混杂其中,所以高效准确地鉴别和剔除淫秽色情信息成为一项十分艰巨的任务。 此外,移动直播的大热也导致图片鉴黄需求...

    imingyu 评论0 收藏0
  • 玩转3D Swiper性感秀之思路分析总结

    摘要:前言继一次的魔方之后,这次带你一起玩转性感美女秀,正常套路,请先一堵为快,有兴趣继续,没兴趣也可以看看美女养眼哦 showImg(https://segmentfault.com/img/bVbi4d2?w=1008&h=298); 前言   继一次的3D魔方之后,这次带你一起玩转性感美女秀,正常套路,请先一堵为快,有兴趣继续,没兴趣也可以看看美女养眼哦

    Zoom 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<