摘要:項目初始化創建一個文件,快捷創建非常簡單。基本使用方法具體的請自行點擊連接查看喲頁面數據解析是一個的庫,可以理解為一個版本的,用來從網頁中以取數據,使用方式和基本相同。執行數組中每個值的函數,包含四個參數作為第一次調用的第一個參數。
項目初始化
創建一個package.json文件,webstorm快捷創建package.json非常簡單。
使用 npm init 快速創建。
需要下載的的模塊
superagent 頁面數據下載
cheerio 頁面數據解析
這是2個npm包,我們先下載:
npm install superagent cheerio --save
需要引入的模塊
fs
path
引入項目依賴const cheerio = require("cheerio"); const agent = require("superagent"); const path = require("path"); const fs = require("fs");定義地址數組
我們希望以隊列的形式逐個對這些地址進行訪問,獲取HTML代碼,以便后續處理:
const urls = [{ page:1, url:"https://www.imooc.com/course/list?c=fe&page=1" },{ page:2, url:"https://www.imooc.com/course/list?c=fe&page=2" },{ page:3, url:"https://www.imooc.com/course/list?c=fe&page=3" }];定義數據結構
慕課網課程列表:
對此我們定義如下的數據結構:
[ { page: 1, data: [ { title:"", // 課程標題 imgurl:"", // 課程圖片 level:"", // 等級 studynum:0, // 學習人數 description:"xxxx" // 課程描述 } ...... // 每一個頁面有多條課程信息 ] } ...... // 一共有多個頁面 ]superagent 頁面數據下載
superagent是nodejs里一個非常方便的客戶端請求代碼模塊,superagent是一個輕量級的,漸進式的ajax API,可讀性好,學習曲線低,內部依賴nodejs原生的請求API,適用于nodejs環境下。
基本使用方法:
具體的請自行點擊連接查看喲...
request .get("/login") .end(function(err, res){ // code });cheerio 頁面數據解析
cheerio是一個node的庫,可以理解為一個Node.js版本的jquery,用來從網頁中以 css selector取數據,使用方式和jquery基本相同。
需要先loading一個需要加載html文檔,后面就可以jQuery一樣使用操作頁面了。
基本使用方法:
具體的請自行點擊連接查看喲...
const cheerio = require("cheerio"); const $ = cheerio.load("
這才是本篇文章的重頭戲...
我們需要使用數組的一個方法 reduce()
arr.reduce([callback, initialValue])
有不太懂這個方法的可以查看我寫的筆記:https://segmentfault.com/n/13...
reduce() 方法接收一個函數作為累加器(accumulator),數組中的每個值(從左到右)開始縮減,最終為一個值。
callback (執行數組中每個值的函數,包含四個參數)
initialValue (作為第一次調用 callback 的第一個參數。)
還有一個是Promise實現異步處理
有不太懂這個方法的可以查看我寫的筆記:https://segmentfault.com/n/13...
具體是使用Promise的這個方法:
Promise.resolve()
這個方法返回一個fulfilled的Promise實例,或者原始的Promise實例。
代碼實現:
// 實現隊列 // 本質: 對.then()方法實現累加 let curPromise = urls.reduce((promise,curl) => { return promise.then(() => { return new Promise(resolve => { // 網絡獲取當前地址的網頁內容 requestGet(curl,() => { resolve(); }); }); }); },Promise.resolve());將數據寫入result.json文件中
代碼實現:
// 寫入數據 curPromise.then(()=>{ fs.writeFile("result.json", JSON.stringify(result), function (err) { if(err) throw new Error("appendFile failed..."); console.log("數據寫入success..."); }); });完整代碼
// 項目依賴 const cheerio = require("cheerio"); const agent = require("superagent"); const path = require("path"); const fs = require("fs"); // 地址數據 const urls = [{ page:1, url:"https://www.imooc.com/course/list?c=fe&page=1" },{ page:2, url:"https://www.imooc.com/course/list?c=fe&page=2" },{ page:3, url:"https://www.imooc.com/course/list?c=fe&page=3" }]; // 最終的數據 let result = []; // 數據結構 /** * [ * { * page: 1, * data: [ * {title:xx,imgurl:xx...}, * ...... * ] * } * ...... * ] */ // 發起get請求 function requestGet(urlObj,callback){ agent.get(urlObj.url) .end((err,res) => { if(err) throw new Error(err); // 分析頁面 let pageJson = analysis(res.text); // 拼接數據 result.push({ page:urlObj.page, data:pageJson }); console.log(`寫入第${urlObj.page}頁的數據...`); // 執行回調 callback(); }); } // 對網頁分析 function analysis(data){ let page = []; let $ = cheerio.load(data); let courseArr = $(".course-list").find(".course-card-container"); courseArr.each((index,element) => { let _this = $(element); // 組裝數據 page.push({ title:_this.find(".course-card-name").text(), imgurl:path.join("http:",_this.find(".course-card-top img").attr("src")), level:_this.find(".course-card-info span:first-child").text(), // level:_this.find(".icon-set_sns").parent().prev().text(), studynum:_this.find(".icon-set_sns").parent().text(), description:_this.find(".course-card-desc").text() }); }); return page; } // 實現隊列 // 本質: 對.then()方法實現累加 let curPromise = urls.reduce((promise,curl) => { return promise.then(() => { return new Promise(resolve => { // 具體的內容 requestGet(curl,() => { resolve(); }); }); }); },Promise.resolve()); // 寫入數據 curPromise.then(()=>{ fs.writeFile("result.json", JSON.stringify(result), function (err) { if(err) throw new Error("appendFile failed..."); console.log("數據寫入success..."); }); });啟動項目
node app.js
可以看到終端有次序的輸出了以下內容:
當打開生成的 result.json 文件,其結構也符合我們的預期:
至此,這篇文章也就結束啦,如果您有好的想法請留言喲。
持續學習中...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/93607.html
摘要:行爬取頂點全網任意小說掘金之前連續多篇文章介紹客戶端爬取平臺,今天我們從零開始,實現爬取頂點小說網任意一本小說的功能。文件標記所有文件我的后端書架后端掘金我的后端書架月前本書架主要針對后端開發與架構。 30行js爬取頂點全網任意小說 - 掘金之前連續多篇文章介紹客戶端爬取平臺(dspider),今天我們從零開始,實現爬取頂點小說網任意一本小說的功能。 如果你還不知道客戶端爬取,可以先看...
摘要:行爬取頂點全網任意小說掘金之前連續多篇文章介紹客戶端爬取平臺,今天我們從零開始,實現爬取頂點小說網任意一本小說的功能。文件標記所有文件我的后端書架后端掘金我的后端書架月前本書架主要針對后端開發與架構。 30行js爬取頂點全網任意小說 - 掘金之前連續多篇文章介紹客戶端爬取平臺(dspider),今天我們從零開始,實現爬取頂點小說網任意一本小說的功能。 如果你還不知道客戶端爬取,可以先看...
摘要:瀏覽器拿到了簡書網的完整的頁面代碼,在解析和渲染這個頁面的時候,里面的圖片靜態資源,他們同樣也是一個個請求都需要經過上面的主要的七個步驟。瀏覽器根據拿到的資源對頁面進行渲染,最終把一個完整的頁面呈現給了用戶。 瀏覽器訪問一個網站所經歷的步驟 Chrome搜索自身的DNS緩存 搜索操作系統自身的DNS緩存(瀏覽器沒有找到緩存或緩存已經失效)查看Chrome瀏覽器的DNS緩存信息(chr...
摘要:時間年月日星期六說明本文部分內容均來自慕課網。這個時候,可以啟動多臺積分系統,來同時消費這個消息中間件里面的登錄消息,達到橫向擴展的作用。 時間:2017年07月22日星期六說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:無學習源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程安排 Java...
閱讀 1297·2021-11-22 09:34
閱讀 2162·2021-10-08 10:18
閱讀 1724·2021-09-29 09:35
閱讀 2453·2019-08-29 17:20
閱讀 2137·2019-08-29 15:36
閱讀 3398·2019-08-29 13:52
閱讀 775·2019-08-29 12:29
閱讀 1183·2019-08-28 18:10