文档章节

无头浏览器,从phantomjs到webkit4j

xtuhcy
 xtuhcy
发布于 2016/10/14 11:03
字数 1191
阅读 878
收藏 1
点赞 2
评论 0

#一、从浏览器说起

无头浏览器即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

粉丝 103
博文 16
码字总数 18277
作品 1
北京
后端工程师
Web 自动化测试与智能爬虫利器:PhantomJS 简介与实战

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

大数据之路
2015/04/28
0
2
聊聊phantomjs的优化措施

序 本文主要小结一下phantomjs的优化措施 phantomjs phantomjs相当于一个后台浏览器,有点内嵌jetty的味道,通常在自动化测试或者爬虫领域用。 优化点 池化技术,避免重复启动 对于其他语言进...

go4it
2017/11/07
0
0
PhantomJs 2 Headless Chrome

PhantomJS is dead, long live headless browsers 这是一个从PhantomJs走到Headless Chrome的故事,趟过了Highcharts的性能问题的坑,掉入过中文官方文档的错误的坑,尝试过依赖库的源码修改...

charleschu
04/14
0
0
ubuntu 安装phantomjs、chromedriver、geckodriver

一、安装phantomjs 1.从官网下载http://phantomjs.org/download.html 2.加压 tar -zxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 3.mv phantomjs-2.1.1-linux-x86_64 /usr/local/share/phanto......

littlemesieV
04/18
0
0
利用Selenium和PhantomJS在Centos下跑测试

做过selenium自动化项目的同学应该都遇到过这样的问题:测试用例太多,运行速度过慢导致团队成员怨声载道。 于是便有了selenium grid和多线程运行selenium测试用例的方法。这些方法各有利弊这...

江边望海
2015/08/06
0
1
[问题解决] Selenium+PhantomJS使用时报错原因及解决方案

在做动态网页爬虫时用到了selenium + PhantomJS,安装好之后运行时报错: 说是 Selenium 已经弃用 PhantomJS ,请使用火狐或者谷歌无界面浏览器。 查找之后得到答案时selenium的版本问题,使用p...

Eappo_Geng
06/13
0
0
java抓取动态生成的网页--吐槽

最近在做项目的时候有一个需求:从网页面抓取数据,要求是首先抓取整个网页的html源码(后期更新要使用到)。刚开始一看这个简单,然后就稀里哗啦的敲起了代码(在这之前使用过Hadoop平台的分...

开源oschina
2014/10/16
0
0
聊聊Selenium不同webdriver的构造

序 本文主要讨论Selenium不同webdriver的构造 Selenium 2.0 Selenium 2,又名 WebDriver,它的主要新功能是集成了 Selenium 1.0 以及 WebDriver(WebDriver 曾经是 Selenium 的竞争对手)。也...

go4it
2017/11/05
0
0
zg手册 之 scrapy 开发(4)-- javascript 动态页面的抓取

javascript 动态页面 目前许多网站大量运用js脚本进行一些页面的处理,这些页面的抓取对爬虫是个挑战。 这类页面的抓取,我用到了下面的方法 分析页面(firebug/chrome调试工具 等),找到a...

东昕
2014/04/02
0
2
关于phoenixframe自动化平台在Linux环境下执行用例说明

phoenixframe自动化平台支持在Linux环境下使用phantomjs,Firefox,chrome执行测试用例。但有以下几个问题需要注意: 1、若无法启动phantomjs,Firefox,chrome的驱动,则请检查存放drivers...

孟飞阳
2015/07/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java8新特性之接口

在JDK8以前,我们定义接口类中,方法都是抽象的,并且不能存在静态方法。所有的方法命名规则基本上都是 public [返回类型] [方法名](参数params) throws [异常类型] {}。 JDK8为接口的定义带...

developlee的潇洒人生
39分钟前
0
0
aop + annotation 实现统一日志记录

aop + annotation 实现统一日志记录 在开发中,我们可能需要记录异常日志。由于异常比较分散,每个 service 方法都可能发生异常,如果我们都去做处理,会出现很多重复编码,也不好维护。这种...

长安一梦
50分钟前
1
0
将博客搬至CSDN

AHUSKY
今天
1
0
Python web框架Django学习(1)

1.Django简介 (1)Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。Django是一个开放源代码的Web应用框架,由Python写成。 (2...

十年磨一剑3344
今天
0
0
Databook-数据之书

Databook-数据之书 用于数据分析的Jupyter Notebooks。 不需购买服务器,快速开始自己的数据分析过程。 源码:https://github.com/openthings/databook 作者:openthings,https://github.co...

openthings
今天
5
0
Python PIPEs

https://www.python-course.eu/pipes.php https://www.tutorialspoint.com/python/os_pipe.htm

zungyiu
今天
1
0
gRPC学习笔记

gRPC编程流程 1. proto文件定义 proto文件用于定义需要通过gRPC生成的接口,可以理解为接口定义文档 2. 通过构建工具生成服务基类代码-Maven或Gradle 3. 服务端开发 服务端实现类须实现通过构...

OSC_fly
今天
0
0
Docker Mac (三) Dockerfile 及命令

Dockerfile 最近学习docker的时候,遇到一件怪事,关于docker镜像可能会被破坏,还不知道它会有此措施 所以需要了解构建Dockerfile的正确方法 Dockerfile是由一系列命令和参数构成的脚本,这些命...

___大侠
今天
0
0
Android Studio+NDK+Cmake 移植FFmpeg-4.0.2命令行工具

一、编译 参考大神的帖子,亲测一次编译成功:https://blog.csdn.net/bobcat_kay/article/details/80889398 鉴于以前查文档的经验,这里附上编写例子的时间:2018年7月22日 我用的是ubantu,...

她叫我小渝
今天
0
0
mysql创建数据库

登录MYSQL mysql -u root -p 脚本创建数据库WeChat,并制定默认的字符集是utf8mb4。 CREATE DATABASE Wechat DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci; 授权 grant all......

niithub
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部