Nodejs优秀工具之nightmare

楔子

最近帮一个小伙伴找实习岗位,看到某公司给他发的面试题挺有意思,趁着不忙自己研究了一番,做个笔记留待以后复习。

面试题

使用 http://www.nightmarejs.org/ 爬取 https://box.jimu.com/Venus/List 第一页项目数据,并生成一个数组,每个数据格式为 {name: **, rate: **, month: **, status: **}

分析

首先当我们看到这个题目的时候应该大概就了解这是一个爬虫任务,使用工具到指定页面爬取数据,同时将爬取到的数据生成某种格式。
那么这道面试题的目的是要考察求职者哪些知识/能力呢?这里简单分析了下:

  • 有没有接触过node/npm 这个是最基础的,如果这个都不知道就不用往下看了
  • nightmare工具的使用
  • JS数据的处理,如何生成项为对象格式的数组
  • JS基础知识,比如获取元素、分割字符串等
  • 踩坑能力(这个后面再说)
    好了,分析就这么多,接下来我们开始试着去解答这道面试题。

开撸

首先我们应该先了解下nightmare这个工具,官网链接http://www.nightmarejs.org/
官方说法A high-level browser automation library,翻译过来就是高级浏览器自动化库
OK,既然要使用这个库首先要安装,我们新建nightmare文件夹,然后执行npm install nightmare 按照常理应该稍等就安装好,但是这里居然报错了。。。错了。。。了。
我就是在这里踩了一个坑,报错就是在执行下面图这步

image.png

百度了下发现,nightmare依赖于electron,那么先安装electron呢?不好意思,也报错。。瞬间我就懵了,于是我试着在百度搜报错的代码,找到下面的解决方法eletron安装卡在 node install.js,原因居然是网速问题!!!无力吐槽。。
OK,按照链接中的方法,成功安装nightmare。这里贴一个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);
  });

有兴趣可以在复制下来自已看一下效果,这里重点看一下nightmare常用的API

  • goto(url[,headers]) url为你要跳转的网站url
  • wait(selector) 等待某个dom元素出现
  • type(selector[,text]) 在selector元素中输入text文本
  • click(selector) 点击某个dom元素
  • evaluate(fn[,agr1,agr2,...]) 在客户端注入JS脚本并执行 也就是你自己要封装数据的代码
  • end() 执行完成,等待对数据的处理
    其他的API大家可以自行去官方文档查看。其实整个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);
    })

大致结构就是这样,剩下的就是我们对要爬取的网站进行结构分析,然后写出符合要求的代码,我这里贴出我自己写的代码,轻喷(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;

最终返回的数据如下图

image.png

这里不足的地方就是返回的数据中month出现在第一个位置上,百度了下这是chrome浏览器的默认机制,按照字母顺序排序对象属性,目前还在查找相关方法以达到题目要求

写在最后

虽然本文写的是nightmare工具的使用,但是要想写出最终代码JS基础知识是必不可少的,框架/库每天都在更新,只有打牢基础才能以不变应万变,这才是最重要的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,395评论 25 707
  • 开始教程之前,请允许我假设你已经有了一个常用的的编辑器(或者 IDE),系统中也安装了Node.js 和 npm,...
    程序人生_小龙阅读 49,783评论 1 38
  • 让鸟儿为绿荫轻啼 我为生命重复无韵的诗词 爬满心灵橱窗的文字 将全部的故事编织 黎明吻落晨曦最后一滴露珠 朝花落...
    蔷薇花的记忆阅读 231评论 0 2
  • 我爱你!婵姐!美婵婵!没有语言来形容爱你的感觉,只能用和表情来感受爱你的喜怒哀乐! 苏菲玛索的心跳的感觉!我的生活...
    心迹CC阅读 139评论 0 0