文档章节

无头浏览器,从phantomjs到webkit4j

xtuhcy
 xtuhcy
发布于 2016/10/14 11:03
字数 1191
阅读 1.4K
收藏 1

#一、从浏览器说起

无头浏览器即headless browser,是一种没有界面的浏览器。既然是浏览器那么浏览器该有的东西它都应该有,只是看不到界面而已。

##浏览器内核

  • Webkit:目前最主流的浏览器内核,webkit是苹果公司开源的浏览器内核,其前身是KHTML。基于Webkit的浏览器很多,比如Safari,Chrome,Opera

  • Gecko:是Firefox浏览器的内核

  • Trident:是IE浏览器的内核

  • Blink:是webkit的一个分支版本,由google开发

##Webkit内核 Webkit无疑是目前最流行的浏览器内核,以Webkit为核心存在很多移植(port),包括Safari、iPhone、Chrome、Android、QTWebKit等。不同的port专注于不同的领域。Mac的port注意力集中在浏览器和操作系统的分割上,允许把ObjectC和C++绑定并嵌入原生应用的渲染。Chromium专注在浏览器上。QtWebKit的port在他的跨平台GUI应用架构上给apps提供运行时环境或者渲染引擎。

#二、无头浏览器

  • PhantomJS:基于QtWebkit的无头浏览器,第一看到PhantomJS以为是一个NodeJS的模块,其实PhantomJS和NodeJS的处于同等级别的应用,两者毫无关系。唯一有联系的就是他们使用的开发语言都是javascript
  • SlimerJS:基于Gecko的无头浏览器,SlimerJS和PhantomJS基本兼容,就是一个内核换成了Gecko的PhantomJS
  • HtmlUnit:纯java开发的无头浏览器,完全java开发,javascript引擎使用的是Rhnio,由于不是基于Webkit、Gecko等主流内核开发,兼容性不好

##PhantomJS PhantomJS可以说是目前使用最为广泛,也是最被认可的无头浏览器。由于采用的是Webkit内核,因此其和目前的Safari,Chrome等浏览器兼容性十分好。

###安装 PhantomJS的安装十分简单,下载http://phantomjs.org/download.html,下载下来后解压即可。编写测试代码test.js

var page = require('webpage').create();
page.open('http://example.com', function(status) {
  console.log("Status: " + status);
  console.log(page.content);
  phantom.exit();
});

bin\phantomjs.exe test.js,如果status返回success即成功。通过page.content即可获得下载并渲染好的网站内容。

###和nodejs结合使用 前面说过,PhantomJS和NodeJS是平等的关系,如果说NodeJS把javascirpt引擎V8挪到服务器端,PhantomJS则把WebKit整个引擎都挪到了服务器端。

在nodejs中使用phantomjs,需要用到phantomjs中的一个Child Process模块,介绍在这里http://phantomjs.org/api/child_process/。

庆幸的是万能的github已经有对phantomjs的node支持库,项目地址在这里https://github.com/amir20/phantomjs-node

###和java结合使用 PhantomJs和java的结合使用目前还比较麻烦,主要还是直接调用phantomjs执行,如:

Runtime rt = Runtime.getRuntime();     
Process p = rt.exec("phantomjs /Users/cxs/utils/phantomjs/codes.js "+url);

既然nodejs可以通过child_process实现与phantomjs的交互,那么java为啥不行呢?目前还没有找到相应的实现,笔者也在研究这块,希望能提供一个java的实现。

###通过webserver提供服务 可以利用Web服务,在phantomjs中启动一个微型web服务,java进程往这个web服务发送数据及接受处理完成的结果。web服务有两个方式:

  1. 利用PhantomJS自带的webserver模块,可以参考这里:http://phantomjs.org/api/webserver/
  2. 利用NodeJS,搭建Web服务

#三、java环境下的无头浏览器 那么在java环境下有没有一款完全兼容webkit的无头浏览器呢?笔者目前还没有找到任何一款这样的浏览器。要实现这样的浏览器有三个思路:

  1. 完全使用java开发,包括dom解析、css解析、javascript引擎等;
  2. 利用phantomjs的Child Process模块,实现一个类似phatomjs-node的java扩展;
  3. 开发一个java版本的PhantomJS

##HtmlUnit HtmlUnit是一款纯java开发的无头浏览器,他既没有用weibkit内核,也没用gecko内核,其dom解析、css解析、javascript解析都是纯java开发的,因此其兼容性不太理想。

目前HtmlUnit的最新版本的javascript引擎使用的是一款很老的叫做Rhnio的引擎,不管在效率和兼容性上都不理想。在java8中已经使用Nashorn代替Rhnio引擎,Nashorn完全支持ECMAScript 5.1规范,但是笔者尝试用Nashorn代替Rhnio使用HtmlUnit,还是不能有效的解析JQuery这种十分流行的js框架。

##webkit4j 既然PhantomJS可以利用QtWebkit开发出无头浏览器,为啥不能用java结合QtWebkit开发同样的无头浏览器呢,笔者在github上建了一个项目https://github.com/xtuhcy/webkit4j。目前在window环境下已经能成功调用qtwebkit,也希望有兴趣的朋友能一起参与讨论。

© 著作权归作者所有

xtuhcy

xtuhcy

粉丝 123
博文 18
码字总数 20733
作品 1
东城
后端工程师
私信 提问
加载中

评论(1)

土逗吧
土逗吧
老哥 井号后面需要空格的 ~~~~
如何在无头模式下运行WebDriver?

如何在无头模式下运行WebDriver?如果您的CI工具(例如Jenkins)不支持UI,则可能需要这样做。 在无头模式下运行WebDriver自动测试在测试执行速度和更轻松地集成到CI管道方面具有优势。 下面...

程序猿拿Q
2018/11/26
224
0
Web 自动化测试与智能爬虫利器:PhantomJS 简介与实战

估计部分同学没听过这个工具,那先简单介绍下它的背景与作用。 1、PhantomJS 是什么? PhantomJS是一个基于WebKit的服务器端JavaScript API,它无需浏览器的支持即可实现对Web的支持,且原生...

大数据之路
2015/04/28
2.8W
2
PhantomJS+Echarts生成图片(POI第三方集成工具,HttpClient.post)

网友结论:PhantomJS技术方案老旧,推荐使用Puppeteer, 最差也用 casperjs PhantomJS+Echarts生成图片(https://gitee.com/liuzidong/PhantomJSForEcharts) 参考资料 1. ECharts - Java类库(...

近在咫尺远在天涯
2019/09/02
223
0
(转载)Selenium + Chrome headless 报ERROR:gpu_process_transport_factory.cc(1007)]

Selenium不再推荐使用PhantomJS,会报如下警告 UserWarning: Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead warnings.......

西瓜1994
2018/10/30
615
0
Python网络爬虫(JSON, Phantomjs, selenium/Chromedirver,豆瓣电影、斗鱼直播、京东商城爬取)

个人网站刚上线 捧捧场 谢谢~ 项目还是遇到跟多坑的 分享一下 www.baliIT.com 域名备案中 如果不能访问 可以尝试 http://106.12.86.182/ json模块 什么是json? javascript中的对象和数组 对象...

巴黎香榭
2018/11/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Wireshark安装失败或找不到网络接口问题

Wireshark安装失败或找不到网络接口问题 Wireshark捕获数据包,主要依赖Winpcap或Npcap组件。从Wireshark 3.0开始,Npcap代替了Winpcap组件,成为Wireshark默认的网卡核心驱动。当用户安装W...

大学霸
5分钟前
9
0
使用dubbo zookeeper出现的一些问题

1 、在服务提供者方面 @Service要使用dubbo的注解 2、在消费者方面 @Reference 使用dubbo的 3 、消费者开启成功,但一直没有在dubbo中看到服务注册的应用 测试简单的页面也报404错误,这个要...

南桥北木
6分钟前
10
0
sentinel工作流程

1

vqishiyu
6分钟前
22
0
通过手机端远程控制计算机

远程控制可以非常方便的给客户或者同事提供帮助,使用移动端的远程控制,可以更及时的处理问题,Zoho Assist移动端功能非常强大,操作简洁,简单几步即可完成远程协助; 下面给大家演示使用手...

Zoho云服务
10分钟前
30
0
SAF是什么

SAF是 Service Assembly Framework(服务组装框架)的缩写。它提供基于服务注册订阅中心的高效点对点服务调用

writeademo
11分钟前
46
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部