成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

性感慕課-在線被爬

劉德剛 / 1576人閱讀

摘要:剛開始寫的時候我把聲明在了全局,以至于返回成下面這組數(shù)據(jù)爬取課程詳情頁的信息在我們有了所有課程詳情頁的后,我們開始爬取里面的內(nèi)容。

引言

在學習了 alsotang 大神的 《Node.js包教不包會》后的一個爬蟲小練習,期間也碰到挺多小問題,也學到了很多小東西。「單押×3」

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

下面是自己的爬取效果圖

)

同時推薦一個谷歌插件 JSONView,會將 JSON 格式的數(shù)據(jù)轉(zhuǎn)化成上面圖的格式

imoocSpider練習源碼

搭建服務(wù)器

首先,搭建一個 http 服務(wù)

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 來爬取頁面,這里有相關(guān)文檔可以參考: superagent中文文檔、cheerio,都是來自 cnode 社區(qū),當然英語能力較好的也可以參考原文檔。在這里就只貼出這兩個

爬取頁面鏈接 https://www.imooc.com/course/...

我們是要爬取慕課網(wǎng)前端開發(fā)八個頁面的課程中的一些信息,但是打開此鏈接發(fā)現(xiàn)每個頁面只有課程的名稱,并沒有老師的名稱和一些課程的主要信息。因此我們還需要獲取并根據(jù)每個課程的 url 進行爬取。

獲取課程詳情頁鏈接

那我們先來爬取八個頁面的所有課程詳情頁的 url

通過點擊對應(yīng)頁面的按鈕,發(fā)現(xiàn)每次都會發(fā)送一個新的 get 請求,請求的鏈接就是對應(yīng)的頁面,而這里的鏈接只有 page 屬性是不同的,因此我們通過動態(tài)改變 page 就可以模擬點擊對應(yīng)頁來獲取對應(yīng)頁的信息

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

因為有些網(wǎng)站通常都會有安全限制,不會允許同一個域名有過大的高并發(fā)數(shù),因此需要限制并發(fā)數(shù),在這里用我們用到了 async 這個庫。這里是其 github

我們首先把前面代碼封裝成一個函數(shù)

var baseUrl = "https://www.imooc.com/course/list/";
var fetchUrl = function(page, callback) {
    count++;
    console.log("當前并發(fā)數(shù)", 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("釋放并發(fā)數(shù)后當前并發(fā)數(shù)", count);
        
      });
  };

然后用 async 控制并發(fā)數(shù)和八個頁面的抓取

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 會自動把第三個函數(shù)參數(shù)的返回值合并成一個數(shù)組給第四個函數(shù)參數(shù)的 result 參數(shù)。剛開始寫的時候我把 topicUrls 聲明在了全局,以至于返回成下面這組數(shù)據(jù)

爬取課程詳情頁的信息

在我們有了所有課程詳情頁的 url 后,我們開始爬取里面的內(nèi)容。首先定義一個函數(shù)

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 控制并發(fā)爬取

//result 為上文中的 result,下面的代碼也都是在上文中的第四個參數(shù)中

var topicUrls = result; //獲取所有 url ,但是大數(shù)組里面有 8 個小數(shù)組

var Urls = [];
//將大數(shù)組合并
for(let i=0,l=topicUrls.length;i

這里要注意一個小問題,就是 result 獲取到的 url 結(jié)構(gòu)是一個大數(shù)組里面包含八個小數(shù)組,因此需要將其小數(shù)組先合并成一個大數(shù)組。

最后

項目源碼

原文地址

每天探索一點點,每天進步一點點。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/95057.html

相關(guān)文章

  • 慕課網(wǎng)_《如何使用高德云圖在線制作屬于你的地圖》學習總結(jié)

    摘要:時間年月日星期日說明本文部分內(nèi)容均來自慕課網(wǎng)。用戶可以在服務(wù)器端調(diào)用云存儲云檢索從而構(gòu)建自己的存儲和檢索服務(wù),甚至可以制作自己的數(shù)據(jù)管理臺。 時間:2017年08月13日星期日說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學源碼:無學習源碼:https://github.com/zccodere/s... 第一章:云圖產(chǎn)品介紹 1-1 云圖產(chǎn)品介紹...

    k00baa 評論0 收藏0
  • 慕課網(wǎng)_《如何使用高德云圖在線制作屬于你的地圖》學習總結(jié)

    摘要:時間年月日星期日說明本文部分內(nèi)容均來自慕課網(wǎng)。用戶可以在服務(wù)器端調(diào)用云存儲云檢索從而構(gòu)建自己的存儲和檢索服務(wù),甚至可以制作自己的數(shù)據(jù)管理臺。 時間:2017年08月13日星期日說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學源碼:無學習源碼:https://github.com/zccodere/s... 第一章:云圖產(chǎn)品介紹 1-1 云圖產(chǎn)品介紹...

    afishhhhh 評論0 收藏0
  • 玩轉(zhuǎn)3D Swiper性感秀之思路分析總結(jié)

    摘要:前言繼一次的魔方之后,這次帶你一起玩轉(zhuǎn)性感美女秀,正常套路,請先一堵為快,有興趣繼續(xù),沒興趣也可以看看美女養(yǎng)眼哦 showImg(https://segmentfault.com/img/bVbi4d2?w=1008&h=298); 前言   繼一次的3D魔方之后,這次帶你一起玩轉(zhuǎn)性感美女秀,正常套路,請先一堵為快,有興趣繼續(xù),沒興趣也可以看看美女養(yǎng)眼哦

    Zoom 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<