爬虫的终极形态:nightmare

爬虫的终极形态:nightmare

nightmare 是一个基于 electron 的自动化库(意思是说它自带浏览器),用于实现爬虫或自动化测试。相较于传统的爬虫框架(scrapy/pyspider),或者dom操作库(cheerio/jsdom),或者基于浏览器的自动化框架(selenium/phantomjs),他的优势在于提供了一个简洁有效 的编程模型。

来看官网给出的一个对比场景:

同样是实现一个向yahoo自动提交关键词并搜索的功能

1. PhantomJS实现

PhantomJS实现

JavaScript

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

phantom.create(function (ph) {

ph.createPage(function (page) {

page.open(‘http://yahoo.com‘, function (status) {

page.evaluate(function () {

var el =

document.querySelector(‘input[title="Search"]‘);

el.value = ‘github nightmare‘;

}, function (result) {

page.evaluate(function () {

var el = document.querySelector(‘.searchsubmit‘);

var event = document.createEvent(‘MouseEvent‘);

event.initEvent(‘click‘, true, false);

el.dispatchEvent(event);

}, function (result) {

ph.exit();

});

});

});

});

});

2. nightmare实现

JavaScript

1

2

3

4

yield Nightmare()

.goto(‘http://yahoo.com‘)

.type(‘input[title="Search"]‘, ‘github nightmare‘)

.click(‘.searchsubmit‘);

怎么玩

安装

Shell

1

yarn add nightmare

涉及到下载并编译一个electron,你国网速下需耐心等待

配置 options

JavaScript

1

2

3

4

5

6

7

openDevTools: {

mode: ‘bottom‘,       // 开发者工具位置:right, bottom, undocked, detach

},

show: true,                 // 要不要显示浏览器

dock: true,                 // 要不要在Dock上显示图标

waitTimeout: 60000,         // .wait() 方法超时时长,单位:ms

executionTimeout: 86400000, // .evaluate() 方法超时时长,单位:ms

实例化

JavaScript

1

2

import Nightmare from ‘nightmare‘

const nightmare = new Nightmare(options)

交互用的API

简单介绍几个:

  • .goto(url[, headers]) 跳转到url
  • .viewport(width, height) 浏览器窗口大小
  • .wait(selector) 等待某个dom元素出现
  • .click(selector) 点击某个dom元素
  • .type(selector[, text]) 在某个dom元素中输入
  • .inject(type, file) 在页面上挂载 js/css 文件内容
  • .evaluate(fn[, arg1, arg2,...]) 在客户端注入JS脚本并执行,从而实现electron模型下的C/S互动及数据交换
  • ……

自动登录并轮询的例子

有那么一个网站(比如叫chagang.site),在我登录进去后,会不定时的查岗,需要点击一个按钮以证明没有离线,怎么用nightmare实现自动挂机呢?

大概分这么几步走:

  1. 先跳转到该网站
  2. 模拟输入帐号信息后点击submit
  3. 登录后等待主界面加载出现
  4. 在客户端起一个定时器,2秒一次轮询那个查岗按钮,发现就模拟点击

JavaScript

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

nightmare

.goto(‘http://chagang.site/‘)

.viewport(1024, 768)

.cookies.clearAll()

.type(‘#username‘, ‘用户名‘)

.type(‘#password‘, ‘密码‘)

.click(‘input[type=submit]‘)

.wait(‘#mainContent‘)

.evaluate(() => {

/* eslint-disable */

function handle() {

// 一个叫inspector的button

var inspector = document.querySelector(‘#inspector‘);

if (inspector && inspector.style.visibility === ‘visible‘) {

inspector.click();

}

}

setInterval(handle, 2000);

/* eslint-enable */

})

.evaluate(() => document.title)

.then(title => console.log(`${title} => 加载完成`))

.catch(err => console.error(err))

好像也没有多难 

小结

本文只涉及到API中的一小部分,宝贝都在文档里。用 nightmare,就是希望借助这种简洁模型的梳理,相对愉悦的实现自动化交互(至于标题,终归是意义过剩的产物,请忽略他的招摇。

时间: 02-20

爬虫的终极形态:nightmare的相关文章

优秀界面的终极形态:隐形的界面

真正优秀的用户界面会被无视,而糟糕的设计则迫使用户注意界面,而非内容.用户都是带着目的来访问网站的:买本新书.学习JQuery.与朋友分享一篇文章.发现新音乐.写小说或者仅仅是寻找最近的目的地.他们不会只为把玩界面而来.实际上,用户根本不在意界面设计.多年来,台式机系统树立的典范和交互式工具的缺失,都使人们开始思考用户界面,它如何发挥作用?如何让设计增色或减分?但用户真的需要关心这些吗? 用户已经熟知界面的模式和组成元素,但他们根本不在意.多年来,网页设计师们已经在按钮颜色.投影.边框和渐变上花

nodejs爬虫笔记(五)---利用nightmare模拟点击下一页

目标 以腾讯滚动新闻为例,利用nightmare模拟点击下一页,爬取所有页面的信息.首先得感谢node社区godghdai的帮助,开始接触不太熟悉nightmare,感觉很高大上,自己写代码的时候问题也很多,多亏大神的指点. 一.选择模拟的原因 腾讯滚动新闻,是每六十秒更新一次,而且有下一页.要是直接获取页面的话得一页一页的获取,不太方便,又想到了找数据接口,然后通过请求得到数据,结果腾讯新闻的数据接口是加密的,这种想法又泡汤了.因而想到笔记(四)中模拟加载更多的模块,看利用nightmare这

软件定义数据中心浅见

真的是浅见,以后随着认识的加深,可能会更新该文. SDDC概述 人家聊SDN.SDS等,VMware干脆跟大家聊SDDC(Software-Defined Data Center),即软件定义数据中心. SDDC是VMware大约三年前提出的概念,认为是云计算的终极形态,并提出数据中心可以通过三个步骤来实现软件 定义,这三个步骤分别为Abstract.Pool.Automate,即首先将物理资源进行抽象,然后将抽象后的逻辑资源池化, 最后将资源池按需自动化部署.编排. 那为什么要软件来定义数据中

Android消息处理机制(Handler 与Message)---01

一.handler的使用场景为么会有handler?(部分内容图片摘自http://www.runoob.com/w3cnote/android-tutorial-handler-message.html) 如有侵犯,请告知. 二.handler的消息处理机制 在Android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长时间的任务后做出相应的通知. UI线程:就是我们的主线程,系统在创建UI线程的时候会初始化一个Looper对象,同时也会创建一个与其关联的Message

设计模式之抽象工厂模式读后

原文地址 : 抽象工厂模式 抽象工厂模式算是工厂相关模式的终极形态 定义: 为创建一组相关或相互依赖的对象提供一个接口, 而且无需指定他们的具体类 跟工厂模式的区别就是 工厂也有个接口规范 在jdk的源码中就有一个不太明显的抽象工厂模式: 那就是List接口, 它在iterable的基础上, 扩展一个创建产品的方法 其中的iterator() 与listIterator() 尽管后者是前者的子类 但是两者的功能是不一样的 Iterator是只能向后移动的迭代器 ListIerator是能够前后移

O2O是机遇不是鸡肋,百度O2O的步伐不会停

俗语讲,好事不出门,坏事传千里,而在互联网时代,千里内外也就是即刻之间.互联网时代有一种恶叫危言耸听,有一种哀叫不求甚解,尤其在企业公关层面一恶一哀的相互影响往往都能产生可怕的杀伤力,包括BAT在内也都曾深受其害.例如关于百度放弃O2O这件事,凡是对行业有一定认知或者主动查明传闻起因的都知道这是不可能的事情. O2O是百度的机遇,虽暗箭难防,但不会退缩 对于百度放弃O2O的传闻,这绝对是一个行业热点,但所有正规主流媒体均未跟进这一消息,为何?不是因为谣言止于智者,而是只要对行业有一点了解就都知道

python爬取github数据

爬虫流程 在上周写完用scrapy爬去知乎用户信息的爬虫之后,github上star个数一下就在公司小组内部排的上名次了,我还信誓旦旦的跟上级吹牛皮说如果再写一个,都不好意思和你再提star了,怕你们伤心.上级不屑的说,那就写一个爬虫爬一爬github,找一找python大牛,公司也正好在找人.临危受命,格外激动,当天就去研究github网站,琢磨怎么解析页面以及爬虫的运行策略.意外的发现github提供了非常nice的API以及文档文档,让我对github的爱已经深入骨髓. 说了这么多废话,讲

(五) 抽象工厂模式

转载:http://www.cnblogs.com/zuoxiaolong/p/pattern6.html 前两章我们已经讨论了两种有关工厂的模式,今天我们来看最后一种与工厂相关的模式,抽象工厂模式. 抽象工厂模式算是工厂相关模式的终极形态,如果各位完全理解了上一章的工厂方法模式,那么抽象工厂模式就很好理解了.它与工厂方法唯一的区别就是工厂的接口里是一系列创造抽象产品的方法,而不再是一个,而相应的,抽象产品也不再是一个了,而是一系列相关的产品.这其实是工厂方法模式的一种扩展不是吗? 通常意义来我

独步天下的创业历险记-论产品的灵性

作为一个软件工程师.也许你认为自己掌握了很多技术,理论上讲,你是可以开发出很多产品的,说的直白点就是,这个世界上有的软件应该都能做出来吧!事情往往没那么简单.你虽然掌握了足够的技术,但是,这并不意味着,你就可以作出有用的产品.产品的价值是市场决定,是用户决定,而不是技术决定,更不是工程师决定的.这是我话题的起点.     技术是可以学习的,他很理性,同时也循规蹈矩,现在说软件技术,只要不太笨的人,投入足够多的时间,一般都是能掌握的.这个世界上有一类人,他们创造技术,我们绝大多数人,只需要学习他们