Nodejs優(yōu)秀工具之nightmare

楔子

最近幫一個(gè)小伙伴找實(shí)習(xí)崗位,看到某公司給他發(fā)的面試題挺有意思弧岳,趁著不忙自己研究了一番凳忙,做個(gè)筆記留待以后復(fù)習(xí)。

面試題

使用 http://www.nightmarejs.org/ 爬取 https://box.jimu.com/Venus/List 第一頁項(xiàng)目數(shù)據(jù)禽炬,并生成一個(gè)數(shù)組涧卵,每個(gè)數(shù)據(jù)格式為 {name: **, rate: **, month: **, status: **}

分析

首先當(dāng)我們看到這個(gè)題目的時(shí)候應(yīng)該大概就了解這是一個(gè)爬蟲任務(wù),使用工具到指定頁面爬取數(shù)據(jù)腹尖,同時(shí)將爬取到的數(shù)據(jù)生成某種格式柳恐。
那么這道面試題的目的是要考察求職者哪些知識/能力呢?這里簡單分析了下:

  • 有沒有接觸過node/npm 這個(gè)是最基礎(chǔ)的桐臊,如果這個(gè)都不知道就不用往下看了
  • nightmare工具的使用
  • JS數(shù)據(jù)的處理胎撤,如何生成項(xiàng)為對象格式的數(shù)組
  • JS基礎(chǔ)知識晓殊,比如獲取元素断凶、分割字符串等
  • 踩坑能力(這個(gè)后面再說)
    好了,分析就這么多巫俺,接下來我們開始試著去解答這道面試題认烁。

開擼

首先我們應(yīng)該先了解下nightmare這個(gè)工具,官網(wǎng)鏈接http://www.nightmarejs.org/
官方說法A high-level browser automation library,翻譯過來就是高級瀏覽器自動化庫
OK介汹,既然要使用這個(gè)庫首先要安裝却嗡,我們新建nightmare文件夾,然后執(zhí)行npm install nightmare 按照常理應(yīng)該稍等就安裝好嘹承,但是這里居然報(bào)錯(cuò)了窗价。。叹卷。錯(cuò)了撼港。。骤竹。了帝牡。
我就是在這里踩了一個(gè)坑,報(bào)錯(cuò)就是在執(zhí)行下面圖這步

image.png

百度了下發(fā)現(xiàn)蒙揣,nightmare依賴于electron靶溜,那么先安裝electron呢?不好意思,也報(bào)錯(cuò)罩息。嗤详。瞬間我就懵了,于是我試著在百度搜報(bào)錯(cuò)的代碼瓷炮,找到下面的解決方法eletron安裝卡在 node install.js断楷,原因居然是網(wǎng)速問題!U副稹冬筒!無力吐槽。茅主。
OK舞痰,按照鏈接中的方法,成功安裝nightmare诀姚。這里貼一個(gè)nightmare在github上的示例:

var Nightmare = require('nightmare');       
var nightmare = Nightmare({ show: true });

nightmare
  .goto('https://duckduckgo.com')
  .type('#search_form_input_homepage', 'github nightmare')
  .click('#search_button_homepage')
  .wait('#zero_click_wrapper .c-info__title a')
  .evaluate(function () {
    return document.querySelector('#zero_click_wrapper .c-info__title a').href;
  })
  .end()
  .then(function (result) {
    console.log(result);
  })
  .catch(function (error) {
    console.error('Search failed:', error);
  });

有興趣可以在復(fù)制下來自已看一下效果响牛,這里重點(diǎn)看一下nightmare常用的API

  • goto(url[,headers]) url為你要跳轉(zhuǎn)的網(wǎng)站url
  • wait(selector) 等待某個(gè)dom元素出現(xiàn)
  • type(selector[,text]) 在selector元素中輸入text文本
  • click(selector) 點(diǎn)擊某個(gè)dom元素
  • evaluate(fn[,agr1,agr2,...]) 在客戶端注入JS腳本并執(zhí)行 也就是你自己要封裝數(shù)據(jù)的代碼
  • end() 執(zhí)行完成,等待對數(shù)據(jù)的處理
    其他的API大家可以自行去官方文檔查看赫段。其實(shí)整個(gè)API看下來還是挺簡單的呀打,那么我們就直接開始我們的需求。
var Nightmare = require("nightmare");
var nightmare = Nightmare({show:false})
nightmare
    .goto("https://box.jimu.com/Venus/List")
        .evaluate(function(){
                //  ourcode
        })
.end()
    .then(function(result){
        console.log(result);
    })
    .catch(function(error){
        console.log(error);
    })

大致結(jié)構(gòu)就是這樣糯笙,剩下的就是我們對要爬取的網(wǎng)站進(jìn)行結(jié)構(gòu)分析贬丛,然后寫出符合要求的代碼,我這里貼出我自己寫的代碼给涕,輕噴(o(╯□╰)o)

var links = document.querySelectorAll(".project");
        var listArr = [],
            listObj = {},
            len = links.length;
         for(let i = 0;i < len;i++){
                listObj.name = links[i].getElementsByClassName("title")[0].innerText;
                listObj.rate = links[i].getElementsByClassName("invest-item-profit")[0].innerText + "%";
                listObj.month = links[i].getElementsByClassName("time")[0].getElementsByClassName("num")[0].innerText + links[i].getElementsByClassName("time")[0].getElementsByClassName("tip")[0].innerText.slice(-2,-1);
                listObj.status = links[i].getElementsByClassName("more-title")[0].innerHTML;
                listArr.push(listObj);
                listObj = {};
            } 
        return listArr;

最終返回的數(shù)據(jù)如下圖

image.png

這里不足的地方就是返回的數(shù)據(jù)中month出現(xiàn)在第一個(gè)位置上豺憔,百度了下這是chrome瀏覽器的默認(rèn)機(jī)制,按照字母順序排序?qū)ο髮傩怨幻恚壳斑€在查找相關(guān)方法以達(dá)到題目要求

寫在最后

雖然本文寫的是nightmare工具的使用恭应,但是要想寫出最終代碼JS基礎(chǔ)知識是必不可少的,框架/庫每天都在更新耘眨,只有打牢基礎(chǔ)才能以不變應(yīng)萬變昼榛,這才是最重要的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末剔难,一起剝皮案震驚了整個(gè)濱河市胆屿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钥飞,老刑警劉巖莺掠,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異读宙,居然都是意外死亡彻秆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唇兑,“玉大人酒朵,你說我怎么就攤上這事≡剑” “怎么了蔫耽?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長留夜。 經(jīng)常有香客問我匙铡,道長,這世上最難降的妖魔是什么碍粥? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任鳖眼,我火速辦了婚禮,結(jié)果婚禮上嚼摩,老公的妹妹穿的比我還像新娘钦讳。我一直安慰自己,他們只是感情好枕面,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布愿卒。 她就那樣靜靜地躺著,像睡著了一般潮秘。 火紅的嫁衣襯著肌膚如雪琼开。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天唇跨,我揣著相機(jī)與錄音稠通,去河邊找鬼。 笑死买猖,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的滋尉。 我是一名探鬼主播玉控,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼狮惜!你這毒婦竟也來了高诺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤碾篡,失蹤者是張志新(化名)和其女友劉穎虱而,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體开泽,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡牡拇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惠呼。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡导俘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出剔蹋,到底是詐尸還是另有隱情旅薄,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布泣崩,位于F島的核電站少梁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏矫付。R本人自食惡果不足惜猎莲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望技即。 院中可真熱鬧著洼,春花似錦、人聲如沸而叼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽葵陵。三九已至液荸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間脱篙,已是汗流浹背娇钱。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绊困,地道東北人文搂。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像秤朗,于是被迫代替她去往敵國和親煤蹭。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,070評論 25 707
  • 開始教程之前取视,請?jiān)试S我假設(shè)你已經(jīng)有了一個(gè)常用的的編輯器(或者 IDE)硝皂,系統(tǒng)中也安裝了Node.js 和 npm,...
    程序人生_小龍閱讀 49,828評論 1 38
  • 讓鳥兒為綠蔭輕啼 我為生命重復(fù)無韻的詩詞 爬滿心靈櫥窗的文字 將全部的故事編織 黎明吻落晨曦最后一滴露珠 朝花落...
    薔薇花的記憶閱讀 233評論 0 2
  • 我愛你作谭!嬋姐稽物!美嬋嬋!沒有語言來形容愛你的感覺折欠,只能用和表情來感受愛你的喜怒哀樂贝或! 蘇菲瑪索的心跳的感覺吼过!我的生活...
    心跡CC閱讀 142評論 0 0