0x0 什么是无头浏览器
什么是无头浏览器(headless browser),简单来说是一种没有图形界面gui的WEB浏览器。做前端开发和Web测试的同学对 Headless(无头浏览器)都不会陌生.它可以直接运行在服务端,向客户端提供服务接口。既然是浏览器那么浏览器该有的东西它都应该有,只是看不到界面而已。我们使用浏览器的一般步骤为:启动浏览器、打开一个网页、进行交互。而无头浏览器指的是我们使用脚本来执行以上过程的浏览器,能模拟真实的浏览器使用场景。它提供了对于网页的控制,这种控制所依赖的环境和有界面 web 浏览器类似。它是良好的网页测试工具,提供了和普通 web 浏览器同样的功能,包括渲染 HTML、页面布局、颜色以及字体,同时也提供了 js和ajax的加载和执行。
0x1 它有什么用途
它的主要用途可以:做表单的自动提交、web自动化控制、模拟键盘输入,抓取网页执行并渲染(解决传统 HTTP抓取web难以处理异步请求的问题) 用浏览器自带的一些调试工具和性能分析工具帮助分析问题,前端无界面自动化测试等。
0x2 有哪些无头浏览器
Chrome headless:目前最新的Chrome版本在Mac,Linux,Windows上都可以使用headless模式
调用方式如下:
chrome --headless http://www.test.org
PhantomJS:基于QtWebkit的无界面浏览器,它会把网站加载到内存并执行页面上的 JavaScript。可在nodejs中使用PhantomJS。目前使用最为广泛,也是最被认可的无头浏览器。它采用的是Webkit内核,因此其和目前的Safari,Chrome等浏览器兼容性比较好。
SlimerJS:基于Gecko的无头浏览器,SlimerJS和PhantomJS基本兼容,就是一个内核换成了Gecko的PhantomJS。SlimerJS所提供的API,可以使用javascript模拟在浏览器上的任何操作:打开页面、前进/后退、页面点击、鼠标滚动、DOM处理、CSS选择器、Canvas画布、SVG画图,如此等等。
HtmlUnit:纯java开发的无头浏览器,以模拟浏览器运行,完全java开发,javascript引擎使用的是Rhinojs引擎,由于不是基于Webkit、Gecko等主流内核开发,兼容性不好。
Puppeteer: 是一个Nodejs的库,可以调用Chrome的API来操纵Web,相比较PhantomJs,它最大的特点就是它的操作Dom可以完全在内存中进行模拟。在V8引擎中处理而不打开浏览器,是Chrome团队在维护,会有更好的兼容性和前景。
0x3与python结合使用
python通过selenium使用chrome headless
示例:
from selenium import webdriver
options = webdriver.ChromeOptions()
#设置proxy时添加的额外参数,允许不安全的证书
options.add_argument('--ignore-certificate-errors')
#添加无头参数
options.add_argument('headless')
0x4 与nodejs结合使用
Puppeteer 一个 node 库,通过 DevTools 协议控制无界面的 Chromium 浏览器.使用Puppeteer,示例代码:
const puppeteer = require('puppeteer');
(async () => { const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
await page.screenshot({path: 'example.png'});
await browser.close(); })();
0x5 与java 结合使用
使用htmlunit示例:
public class Main {
public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException {
final WebClient mWebClient = new WebClient();
mWebClient.getOptions().setCssEnabled(false);
mWebClient.getOptions().setJavaScriptEnabled(false);
final HtmlPage mHtmlPage = mWebClient.getPage("http://127.0.0.0/web");
System.out.println(mHtmlPage.asText());
mWebClient.closeAllWindows();
}
}
本文暂时没有评论,来添加一个吧(●'◡'●)