nodejs抓取动态网页(0x0什么是无头浏览器有哪些无头Chromeheadless)
优采云 发布时间: 2022-01-18 17:17nodejs抓取动态网页(0x0什么是无头浏览器有哪些无头Chromeheadless)
0x0 什么是无头浏览器
什么是无头浏览器(headless browser),简单来说就是没有图形界面gui的WEB浏览器。做前端开发和web测试的同学对Headless(无头浏览器)比较熟悉。它可以直接在服务器上运行,并向客户端提供服务接口。既然是浏览器,它应该有浏览器应该有的一切,却看不到界面。我们使用浏览器的一般步骤是:启动浏览器、打开网页并进行交互。无头浏览器是指我们使用脚本执行上述过程的浏览器,它可以模拟真实的浏览器使用场景。它在类似于接口 Web 浏览器的环境中提供对网页的控制。它是一个很好的网络测试工具,提供与普通网络浏览器相同的功能,
0x1 有什么用
它的主要用途可以是:自动表单提交、web自动化控制、模拟键盘输入、抓取网页执行和渲染(解决传统HTTP抓取web难以处理异步请求的问题)、使用一些自带的调试工具浏览器和性能分析工具帮助分析问题、前端无界面自动化测试等。
0x2 什么是无头浏览器
Chrome headless:最新的 Chrome 版本可以在 Mac、Linux、Windows 上使用 headless 模式
调用方法如下:
铬——无头
PhantomJS:基于 QtWebkit 的无界面浏览器,将 网站 加载到内存中并在页面上执行 JavaScript。PhantomJS 在 nodejs 中可用。目前最广泛使用和认可的无头浏览器。它使用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 无头
例子:
从硒导入网络驱动程序
选项 = webdriver.ChromeOptions()
#设置代理以允许不安全证书时添加的附加参数
options.add_argument('--ignore-certificate-errors')
#添加无头参数
options.add_argument('headless')
0x4与nodejs结合使用
Puppeteer 一个节点库,通过 DevTools 协议控制无界面的 Chromium 浏览器。使用 Puppeteer,示例代码:
const puppeteer = require('puppeteer');
(async() => { const browser = await puppeteer.launch();
常量页面 = 等待 browser.newPage();
等待 page.goto('');
等待 page.screenshot({path: 'example.png'});
等待浏览器.close(); })();
0x5 与 java 一起使用
使用 htmlunit 的示例:
公共类主要{
public static void main(String[] args) 抛出 FailingHttpStatusCodeException、MalformedURLException、IOException {
最终 WebClient mWebClient = new WebClient();
mWebClient.getOptions().setCssEnabled(false);
mWebClient.getOptions().setJavaScriptEnabled(false);
最终的 HtmlPage mHtmlPage = mWebClient.getPage("");
System.out.println(mHtmlPage.asText());
mWebClient.closeAllWindows();
}
}