一、从浏览器说起

无头浏览器即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,也希望有兴趣的朋友能一起参与讨论。

浏览器 之 无头浏览器相关推荐

  1. 干货!一文搞定无头浏览器的概念以及在selenium中的应用

    无头浏览器 无头浏览器,即 Headless Browser,是一种没有界面的浏览器.它拥有完整的浏览器内核,包括 JavaScript 解析引擎.渲染引擎等.与普通浏览器最大的不同是,无头浏览器执行 ...

  2. selenium无头浏览器_无头Selenium浏览器

    selenium无头浏览器 重要要点 无头浏览器无需用户界面即可运行. 不再支持PhantomJS. JBrowser驱动程序是Java 8的低开销选项. 如果需要Java 11支持,所有当前的Jav ...

  3. 基于Python, Selenium, Phantomjs无头浏览器访问页面

    引言: 在自动化测试以及爬虫领域,无头浏览器的应用场景非常广泛,本文将梳理其中的若干概念和思路,并基于代码示例其中的若干使用技巧. 1. 无头浏览器 通常大家在在打开网页的工具就是浏览器,通过界面上输 ...

  4. python爬虫之selenium,谷歌无头浏览器

    python爬虫之selenium和PhantomJS 主要的内容 lenium hantomjs 无头浏览器 的懒加载 一 什么是selenium? 介绍 它是python中的一个第三方库,对外提供 ...

  5. python——selenium框架实现无头浏览器访问 + 规避检测配置

    备注: 有的时候,我们希望,selenium访问的时候,不要出现浏览器, 那么就需要进行配置.具体配置看代码. 运行代码 # !/user/bin/env python # -*- coding: u ...

  6. python 无头浏览器xhr 文件_Python对Selenium调用浏览器进行封装包括启用无头浏览器,及对应的浏览器配置文件...

    """ 获取浏览器 打开本地浏览器 打开远程浏览器 关闭浏览器 打开网址 最大化 最小化 标题 url 刷新 python对selenium封装浏览器调用 ------b ...

  7. 脚本应用实例_Selenium自动化中无头浏览器的应用

    由于在实际的测试环境下,使用图形界面的浏览器占用测试机资源过大效率低, 一般来说,在调试好脚本的基础上,抛开浏览器图形界面执行测试用例的. 现在可以使用的无头浏览器有很多,这里介绍一个使用方便的无头浏 ...

  8. python 无头浏览器_Python对Selenium调用浏览器进行封装包括启用无头浏览器,及对应的浏览器配置文件...

    """ 获取浏览器 打开本地浏览器 打开远程浏览器 关闭浏览器 打开网址 最大化 最小化 标题 url 刷新 Python对Selenium封装浏览器调用 ------b ...

  9. [转载] 基于Python, Selenium, Phantomjs无头浏览器访问页面

    参考链接: Selenium Python技巧 引言: 在自动化测试以及爬虫领域,无头浏览器的应用场景非常广泛,本文将梳理其中的若干概念和思路,并基于代码示例其中的若干使用技巧. 1. 无头浏览器 通 ...

  10. selenium防爬无头浏览器和模拟手机浏览器

    在edge浏览器中使用webdriver时控制台中window.navigator.webdriver 元素会显示True,正常情况下来说应该是关掉的,所以我们用js来屏蔽掉这个元素 from sel ...

最新文章

  1. jsp中有关于超链接的问题
  2. Mac下修改ZOC中文乱码
  3. wxWidgets随笔(4)-hello,world
  4. 关于node-sass和sass-loader安装上去的时候的时候报错的问题
  5. Qt工作笔记-QMenu::exec中使用QWidget::mapToGlobal()与QCursor::pos()之间的些许差异
  6. javascript进阶课程--第一章--函数
  7. 【C语言】分别用下标法,地址法和指针法输出数组中的全部元素
  8. priority_quenue
  9. 强烈推荐与孩子一起学编程(老少咸宜的编程入门奇书,荣获Jolt生产效率大
  10. KITTI数据集(全)百度网盘下载地址
  11. 工具说明书 - 滚动截屏和录屏软件ShareX
  12. 中国互联网创业工具库Startup Tools
  13. umi路由懒加载和权限验证(基于React)
  14. ArcGIS工具 - 批量删除空图层
  15. Html编码(#数字型)与解码小结 - 针对Puny Code(中文域名)的解码处理
  16. 【Linux 常用命令】
  17. Excel中同一单元格设置不同颜色的字体
  18. 每日新闻摘要:适用于Win7,Android Q Beta等的DirectX
  19. MySQL高可用之MMM介绍
  20. HTML+CSS大作业HTML5期末大作业 旅游酒店网站设计——旅游酒店服务预订(1页) web网页设计—— 出游

热门文章

  1. 【好书推荐】写Web必须知道的安全知识 | 《白帽子讲Web安全》
  2. 神经网络与机器学习导言笔记——网络结构与知识表示
  3. 单独得省级行政区数据
  4. Maxwell 介绍、安装、部署、运行(MYSQL -> Maxwell -> kafka)
  5. 机器人操作系统ROS简介
  6. 最优化理论与凸优化到底是干嘛的?
  7. Redis实战pdf
  8. Spring-Boot开发者工具:自动重启、LiveReload、远程开发、默认的开发时属性值
  9. 如何学习-如何学习数据库
  10. 大华服务器如何修改IP,大华摄像头更改IP地址