最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

{<1>}

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

復(fù)制代碼 代碼如下:

var $ = cheerio.load(topicHtml);
//此URL為下一步抓取目標(biāo)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();
//傳遞參數(shù)到下一次并發(fā)抓取
ep.emit('user_html', [userHref, title, href, comment1, author1]);

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

{<2>}

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

復(fù)制代碼 代碼如下:

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
        });
    });
});

運行程序,這段代碼得到的結(jié)果。

{<3>}

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

復(fù)制代碼 代碼如下:

//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ā)現(xiàn)除了score1其他是正確值。仔細(xì)調(diào)試發(fā)現(xiàn),程序是先進(jìn)行了console.log(),然后再進(jìn)行.map()。更準(zhǔn)確地說,在.map()函數(shù)內(nèi),.get()的回調(diào)函數(shù)并沒有執(zhí)行完賦值score,return 返回值就進(jìn)行了。這就是回調(diào)函數(shù)的異步,而外層的同步操作是不會等待回調(diào)函數(shù)做完操作的。

{<4>}

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

復(fù)制代碼 代碼如下:

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

{<7>}

相關(guān)文章

  • Node 切片拼接及地圖導(dǎo)出實例詳解

    Node 切片拼接及地圖導(dǎo)出實例詳解

    這篇文章主要為大家介紹了Node 切片拼接及地圖導(dǎo)出實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Node.js如何自動審核團(tuán)隊的代碼

    Node.js如何自動審核團(tuán)隊的代碼

    在項目開發(fā)中,統(tǒng)一團(tuán)隊的代碼風(fēng)格很重要,本文介紹如何用Node.js來自動審核,來提高您的開發(fā)速度。
    2016-07-07
  • nodejs中art-template模板語法的引入及沖突解決方案

    nodejs中art-template模板語法的引入及沖突解決方案

    本篇文章主要介紹了nodejs中art-template模板語法的引入及沖突解決方案,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • 基于Node-red的在線評語系統(tǒng)(可視化編程,公網(wǎng)訪問)

    基于Node-red的在線評語系統(tǒng)(可視化編程,公網(wǎng)訪問)

    Node-Red是IBM公司開發(fā)的一個可視化的編程工具,在網(wǎng)頁內(nèi)編程,主要是拖拽控件,代碼量很小,這篇文章主要介紹了基于Node-red的在線評語系統(tǒng)(可視化編程,公網(wǎng)訪問),需要的朋友可以參考下
    2022-01-01
  • npm?install安裝報錯:gyp?info?it?worked?if?it?ends?with?ok的解決方法

    npm?install安裝報錯:gyp?info?it?worked?if?it?ends?with?

    今天新啟動一個項目,在 npm install 安裝依賴項時出現(xiàn)報錯,所以下面這篇文章主要給大家介紹了關(guān)于npm?install安裝報錯:gyp?info?it?worked?if?it?ends?with?ok的解決方法,需要的朋友可以參考下
    2022-07-07
  • 淺析Node在構(gòu)建超媒體API中的作用

    淺析Node在構(gòu)建超媒體API中的作用

    超媒體即Hypermedia,是一種采用非線性網(wǎng)狀結(jié)構(gòu)對塊狀多媒體信息(包括文本、圖像、視頻等)進(jìn)行組織和管理的技術(shù)。超媒體的概念類似于早期的超文本,超文本的本質(zhì)是在文本內(nèi)容加上鏈接,這樣就構(gòu)成了超文本。超媒體也類似。
    2014-07-07
  • Node.js的MongoDB驅(qū)動Mongoose基本使用教程

    Node.js的MongoDB驅(qū)動Mongoose基本使用教程

    這篇文章主要介紹了Node.js的MongoDB驅(qū)動Mongoose的基本使用教程,前端js+后端Node.js+數(shù)據(jù)庫MongoDB是當(dāng)下流行的JavaScript全棧開發(fā)方案,需要的朋友可以參考下
    2016-03-03
  • 從零開始學(xué)習(xí)Node.js系列教程之設(shè)置HTTP頭的方法示例

    從零開始學(xué)習(xí)Node.js系列教程之設(shè)置HTTP頭的方法示例

    這篇文章主要介紹了Node.js設(shè)置HTTP頭的方法,詳細(xì)分析了常見HTTP頭的功能、原理及相關(guān)設(shè)置操作技巧,需要的朋友可以參考下
    2017-04-04
  • Node.js API詳解之 dns模塊用法實例分析

    Node.js API詳解之 dns模塊用法實例分析

    這篇文章主要介紹了Node.js API詳解之 dns模塊用法,結(jié)合實例形式分析了Node.js API中dns模塊基本功能、相關(guān)函數(shù)與使用技巧,需要的朋友可以參考下
    2020-05-05
  • node.js中watch機(jī)制詳解

    node.js中watch機(jī)制詳解

    本文給大家?guī)淼氖且黄P(guān)于nodejs中watch機(jī)制的探討,主要探討內(nèi)容是為什么watch不是銀彈,嘗試使用更好的方案來解決這個問題
    2014-11-11

最新評論

乐都县| 台中市| 茌平县| 耒阳市| 百色市| 眉山市| 西安市| 惠来县| 犍为县| 恩施市| 盘山县| 东安县| 丰台区| 洛隆县| 张家港市| 永修县| 金湖县| 奈曼旗| 枝江市| 噶尔县| 杨浦区| 桐城市| 中西区| 屏南县| 阿荣旗| 江华| 黄梅县| 盐山县| 玉林市| 攀枝花市| 准格尔旗| 蚌埠市| 即墨市| 阿勒泰市| 呼图壁县| 六枝特区| 永春县| 吴忠市| 丘北县| 贺州市| 望江县|