国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

用Promise實現隊列(爬一爬慕課網HTML代碼)

XFLY / 3521人閱讀

摘要:項目初始化創建一個文件,快捷創建非常簡單。基本使用方法具體的請自行點擊連接查看喲頁面數據解析是一個的庫,可以理解為一個版本的,用來從網頁中以取數據,使用方式和基本相同。執行數組中每個值的函數,包含四個參數作為第一次調用的第一個參數。

項目初始化

創建一個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("
    ...
"); $("#fruits").addClass("newClass");
使用Promise實現隊列

這才是本篇文章的重頭戲...

我們需要使用數組的一個方法 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),今天我們從零開始,實現爬取頂點小說網任意一本小說的功能。 如果你還不知道客戶端爬取,可以先看...

    stdying 評論0 收藏0
  • 資源集 - 收藏集 - 掘金

    摘要:行爬取頂點全網任意小說掘金之前連續多篇文章介紹客戶端爬取平臺,今天我們從零開始,實現爬取頂點小說網任意一本小說的功能。文件標記所有文件我的后端書架后端掘金我的后端書架月前本書架主要針對后端開發與架構。 30行js爬取頂點全網任意小說 - 掘金之前連續多篇文章介紹客戶端爬取平臺(dspider),今天我們從零開始,實現爬取頂點小說網任意一本小說的功能。 如果你還不知道客戶端爬取,可以先看...

    馬忠志 評論0 收藏0
  • 認識CSS樣式

    摘要:聲明在英文大括號中的的就是聲明,屬性和值之間用英文冒號分隔。嵌入式樣式慕課網,超酷的互聯網技術免費學習平臺,創新的網絡一站式學習實踐體驗服務及時貼心,內容專業有趣易學。6-2 css樣式的優點   為什么使用css樣式來設置網頁的外觀樣式呢?右邊編輯器是一段文字,我們想把“超酷的互聯網”、“服務及時貼心”、“有趣易學”這...

    番茄西紅柿 評論0 收藏0
  • 零碎筆記:瀏覽器訪問一個網站所經歷的步驟

    摘要:瀏覽器拿到了簡書網的完整的頁面代碼,在解析和渲染這個頁面的時候,里面的圖片靜態資源,他們同樣也是一個個請求都需要經過上面的主要的七個步驟。瀏覽器根據拿到的資源對頁面進行渲染,最終把一個完整的頁面呈現給了用戶。 瀏覽器訪問一個網站所經歷的步驟 Chrome搜索自身的DNS緩存 搜索操作系統自身的DNS緩存(瀏覽器沒有找到緩存或緩存已經失效)查看Chrome瀏覽器的DNS緩存信息(chr...

    張金寶 評論0 收藏0
  • 課網_《Java消息中間件》學習總結

    摘要:時間年月日星期六說明本文部分內容均來自慕課網。這個時候,可以啟動多臺積分系統,來同時消費這個消息中間件里面的登錄消息,達到橫向擴展的作用。 時間:2017年07月22日星期六說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:無學習源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程安排 Java...

    twohappy 評論0 收藏0

發表評論

0條評論

XFLY

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<