摘要:剛開始寫的時候我把聲明在了全局,以至于返回成下面這組數據爬取課程詳情頁的信息在我們有了所有課程詳情頁的后,我們開始爬取里面的內容。
引言
在學習了 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
在線爬蟲在這里用到的是 superagent 和 cheerio 來爬取頁面,這里有相關文檔可以參考: 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 結構是一個大數組里面包含八個小數組,因此需要將其小數組先合并成一個大數組。
最后項目源碼
原文地址
每天探索一點點,每天進步一點點。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/95057.html
摘要:時間年月日星期日說明本文部分內容均來自慕課網。用戶可以在服務器端調用云存儲云檢索從而構建自己的存儲和檢索服務,甚至可以制作自己的數據管理臺。 時間:2017年08月13日星期日說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:無學習源碼:https://github.com/zccodere/s... 第一章:云圖產品介紹 1-1 云圖產品介紹...
摘要:時間年月日星期日說明本文部分內容均來自慕課網。用戶可以在服務器端調用云存儲云檢索從而構建自己的存儲和檢索服務,甚至可以制作自己的數據管理臺。 時間:2017年08月13日星期日說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:無學習源碼:https://github.com/zccodere/s... 第一章:云圖產品介紹 1-1 云圖產品介紹...
摘要:前言繼一次的魔方之后,這次帶你一起玩轉性感美女秀,正常套路,請先一堵為快,有興趣繼續,沒興趣也可以看看美女養眼哦 showImg(https://segmentfault.com/img/bVbi4d2?w=1008&h=298); 前言 繼一次的3D魔方之后,這次帶你一起玩轉性感美女秀,正常套路,請先一堵為快,有興趣繼續,沒興趣也可以看看美女養眼哦
閱讀 1229·2021-11-15 11:37
閱讀 2246·2021-09-30 09:55
閱讀 4483·2021-09-22 15:51
閱讀 3741·2021-09-22 15:46
閱讀 2766·2019-08-30 15:52
閱讀 423·2019-08-29 16:20
閱讀 2889·2019-08-29 15:12
閱讀 1130·2019-08-26 18:27