欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

NodeJS制作爬蟲全過程(續(xù))

 更新時間:2014年12月22日 11:11:36   投稿:hebedich  
本文是接上篇NodeJS制作爬蟲全過程,是最上文的一個補充以及優(yōu)化,給需要的小伙伴參考下

書接上回,我們需要修改程序以達到連續(xù)抓取40個頁面的內容。也就是說我們需要輸出每篇文章的標題、鏈接、第一條評論、評論用戶和論壇積分。

如圖所示,$('.reply_author').eq(0).text().trim();得到的值即為正確的第一條評論的用戶。

{<1>}

在eventproxy獲取評論及用戶名內容后,我們需要通過用戶名跳到用戶界面繼續(xù)抓取該用戶積分

復制代碼 代碼如下:

var $ = cheerio.load(topicHtml);
//此URL為下一步抓取目標URL
var user + $('.reply_author').eq(0).attr('href');
userHref = url.resolve(tUrl, userHref);
var title = $('.topic_full_title').text().trim().replace(/\n/g,"");;
var href = topicUrl;
var comment1 = $('.reply_content').eq(0).text().trim();
var author1 = $('.reply_author').eq(0).text().trim();
//傳遞參數到下一次并發(fā)抓取
ep.emit('user_html', [userHref, title, href, comment1, author1]);

在eventproxy這一次中,我們要找到score是放在哪里(class="big")。

{<2>}

找到classname就好辦了,我們先試著把結果輸出一下

復制代碼 代碼如下:

var outcome = superagent.get(userUrl)
    .end(function (err, res) {
        if (err) {
            return console.error(err);
        }
        var $ = cheerio.load(res.text);
        var score = $('.big').text().trim();
        console.log(user[1]);
        console.log(user[2]);
        console.log(user[3]);
        console.log(user[4]);
        console.log($('.big').text().trim());
        return ({
            title: user[1],
            href: user[2],
            comment1: user[3],
            author1: user[4],
            score1: score
        });
    });
});

運行程序,這段代碼得到的結果。

{<3>}

但是問題來了,我們在.end()的回調函數中能正確輸出結果,但是不能正確的輸出outcome。仔細一看,需要輸出的outcome是一個Request對象。這是因為粗心犯的錯的,.end()函數并不會傳遞返回值給Request對象,需要將結果返回到上一層(users)。

復制代碼 代碼如下:

//find userDetails
ep.after('user_html', topicUrls.length, function(users){
    users = users.map(function(user){
        var userUrl = user[0];
        var score;
        superagent.get(userUrl)
            .end(function (err, res) {
                if (err) {
                    return console.error(err);
                }
                //console.log(res.text);
                var $ = cheerio.load(res.text);
                score = $('.big').text().trim();
            });
        return ({
            title: user[1],
            href: user[2],
            comment1: user[3],
            author1: user[4],
            score1: score
        });
    });

把users好好地輸出發(fā)現除了score1其他是正確值。仔細調試發(fā)現,程序是先進行了console.log(),然后再進行.map()。更準確地說,在.map()函數內,.get()的回調函數并沒有執(zhí)行完賦值score,return 返回值就進行了。這就是回調函數的異步,而外層的同步操作是不會等待回調函數做完操作的。

{<4>}

我的做法就是eventproxy再emit一層消息,伴隨著消息把需要的數據一起傳遞給接收消息操作.after(),只有當消息全部接收完畢,再打印出傳遞的參數(結果)。

復制代碼 代碼如下:

score = $('.big')text().trim();
//新添加
ep.emit('got_score', [user[1], user[2], user[3], user[4], score]);
.....
ep.after('got_score', 10, function(users){
console.log(users);
});

{<6>}

這個問題解決了,但score1的數值好像太大了點吧。再一看,原來class='big'有兩個,用戶的話題收藏也是屬于這個class。我們得通過cheerio的.slice( start, [end] )來切取第一個元素,即將score 修改為 score = $('.big').slice(0).eq(0).text().trim();。正確結果如圖。

{<7>}

相關文章

  • Koa項目搭建過程詳細記錄

    Koa項目搭建過程詳細記錄

    本篇文章主要介紹了Koa項目搭建過程詳細記錄,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Node 使用express-http-proxy 做api網關的實現

    Node 使用express-http-proxy 做api網關的實現

    這篇文章主要介紹了Node 使用express-http-proxy 做api網關的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • 詳細談談NodeJS進程是如何退出的

    詳細談談NodeJS進程是如何退出的

    這篇文章主要給大家介紹了關于NodeJS進程是如何退出的相關資料,主要介紹了導致進程退出的三個因素:主動退出;未捕獲的異常、未處理的 promise rejection;未處理的 Event Emitter error 事件 系統(tǒng)信號,需要的朋友可以參考下
    2021-07-07
  • nodejs切換版本使用最新教程(不需要卸載重裝)

    nodejs切換版本使用最新教程(不需要卸載重裝)

    有時候需要運行不同的項目,node版本不一致會導致不少問題,特別是最新版本對應的一些插件,由于語法等原因導致不一定兼容低版本,這樣運行低版本環(huán)境的項目的時候很多坑,這篇文章主要給大家介紹了關于nodejs切換版本使用(不需要卸載重裝)的相關資料,需要的朋友可以參考下
    2022-11-11
  • 使用nodeJs來安裝less及編譯less文件為css文件的方法

    使用nodeJs來安裝less及編譯less文件為css文件的方法

    這篇文章主要介紹了使用nodeJs來安裝less及編譯less文件為css文件的方法,在文章末尾給大家補充介紹了通過nodejs將less文件轉為css文件的方法,具體內容詳情大家通過本文學習吧
    2017-11-11
  • 13 個npm 快速開發(fā)技巧(推薦)

    13 個npm 快速開發(fā)技巧(推薦)

    這篇文章主要介紹了13 個npm 快速開發(fā)技巧,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-07-07
  • Node.js連接數據庫實現過程詳解

    Node.js連接數據庫實現過程詳解

    這篇文章主要為大家介紹了Node.js連接數據庫實現過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Nodejs+Socket.io實現通訊實例代碼

    Nodejs+Socket.io實現通訊實例代碼

    本篇文章主要介紹了Nodejs+Socket.io實現通訊實例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • 你或許不知道的一些npm實用技巧

    你或許不知道的一些npm實用技巧

    這篇文章主要給大家介紹了一些你或許不知道的npm實用技巧,分享一些 npm 包管理工具的實用小竅門,希望能夠略微提高下前端、Node.js 開發(fā)者的生活質量,需要的朋友可以參考下
    2019-07-07
  • 刪除node_modules文件夾太慢的解決方案

    刪除node_modules文件夾太慢的解決方案

    這篇文章主要介紹了刪除node_modules文件夾太慢的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02

最新評論