<div class="iteye-blog-content-contain" style="font-size: 14px"></div>
无头浏览器 通过写脚本来使用无头浏览器访问网站。通过一系列的api 和无头浏览器界面进行交互。
安装 Puppeteer
先创建一个测试用的项目,执行 npm init
初始化好 package.json
,然后执行以下命令安装 Puppeteer:
npm install puppeteer --save-dev
万事开头难,第一步安装时就会遇到问题(如果没有报错,请跳过这一段)。
Puppeteer 安装过程中会去下载 Chromium,墙内用户则会报错。如果你看到以下信息,说明是下载 Chromium 时连接不上。
ERROR: Failed to download Chromium r588429! Set "PUPPETEER_SKIP_CHROMIUM_DOWNLOAD" env variable to skip download.
Error: Download failed: server returned code 502. URL: https://storage.googleapis.com/chromium-browser-snapshots/Win_x64/588429/chrome-win32.zip
或者
ERROR: Failed to download Chromium r588429! Set "PUPPETEER_SKIP_CHROMIUM_DOWNLOAD" env variable to skip download.
{ Error: connect ETIMEDOUT 172.217.24.48:443
如提示所说,设置 PUPPETEER_SKIP_CHROMIUM_DOWNLOAD
可以跳过安装 Chromium。
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1 npm install puppeteer --save-dev
此时可以安装成功,但是使用 Puppeteer 时会由于找不到 Chromium 而报错。可以创建一个文件 test.js
,内容如下:
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();
})();
然后执行 node test.js
则会报错:
$ node test.js
(node:18368) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Chromium revision is not downloaded. Run "npm install" or "yarn install"
(node:18368) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
一个解决方案是先手动下载 Chromium,然后在执行时通过配置指定 Chromium 位置,这篇文章给出了解决步骤。
但是我更倾向于还原 Puppeteer 安装时的过程。但是由于一些环境原因,即便翻-墙了也只能手动下载 Chromium,无法在安装 Puppeteer 时自动下载 Chromium。
读了一下源码之后,可以这么解决:
- 安装 Puppeteer,安装失败,提示无法下载
https://storage.googleapis.com/chromium-browser-snapshots/Win_x64/588429/chrome-win32.zip
- 使用
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1 npm install puppeteer --save-dev
成功安装 Puppeteer - 执行
node test.js
提示无法找到 Chromium - 手动下载步骤 1 中的
chrome-win32.zip
,注意不同版本、不同系统的下载地址是不一样的 - 开启一个静态文件服务,使得
http://127.0.0.1:8000/chrome-win32.zip
指向需要下载的文件 - 改写
downloadURL
方法,使其直接返回http://127.0.0.1:8000/chrome-win32.zip
- 执行
node ./node_modules/puppeteer/install.js
完成安装 - 执行
node test.js
测试能否成功生成截图
至此,成功完成了 Puppeteer 的安装。
Puppeteer API
Puppeteer 的大部分 API 的返回值都是 Promise
,故推荐使用 async
await
来处理异步操作。Puppeteer 的 API 包含以下类:
Puppeteer |
主要用于创建一个浏览器实例,也可以用来下载新的 Chromium,或者设置浏览器的默认参数 |
BrowserFetcher |
用于下载和管理 Chromium |
Browser |
可以创建一个或多个 Page |
BrowserContext |
创建一个隐身模式的浏览器时需要用到 |
Page |
主要 API,用于操作一个页面,后面会详细介绍 |
Worker |
用于处理 WebWorker |
Keyboard |
可以触发键盘按键 |
Mouse |
可以触发鼠标动作 |
TouchScreen |
可以触发触摸屏的动作 |
Tracing |
用于分析性能 |
Dialog |
存在于 page 的 dialog 事件回调中,表示调用弹窗后的对象,包括 alert , beforeunload , confirm 和 prompt
|
ConsoleMessage |
存在于 page 的 console 事件回调中,表示调用 console.log 等方法后的对象 |
Frame |
常用于处理包含多个 frame 的页面。page 中的很多方法就是直接调用的主 frame 的方法 |
ExecutionContext |
执行上下文存在于 frame、浏览器插件、worker 中。可以用来直接执行一段 js |
JSHandle |
通过 page.evaluateHandle 生成,用于将页面中的 handler 挑出来传递使用 |
ElementHandle |
通过 page.$ 生成,用于将页面中某个元素的 handler 挑出来传递使用 |
Request |
在 page.setRequestInterception 方法中使用,可以处理页面的请求 |
Response |
表示页面接收到的响应 |
SecurityDetails |
表示页面的安全信息 |
Target |
可以是 page, background_page, service_worker, browser 等 |
CDPSession |
用于直接和 Devtools 通信 |
Coverage |
用于分析 js 和 css 的代码被页面使用的比例 |
TimeoutError |
超时错误 |
Page
Page 是 Puppeteer 中最重要的一个 API,也是它的核心所在,这里会介绍一些常用的 Page API。
设置页面环境
page.emulate |
设置 viewport 和 ua |
page.setViewport |
设置 viewport |
page.setUserAgent |
设置 ua |
page.setRequestInterception |
中断所有请求,并可以修改请求的返回值 |
page.addScriptTag |
添加 js 脚本 |
page.addStyleTag |
添加 css |
page.setContent |
设置整个 html |
page.setCacheEnabled |
设置缓存是否开启 |
page.setExtraHTTPHeaders |
设置额外的 http 头 |
page.setGeolocation |
设置地理位置 |
page.setJavaScriptEnabled |
设置 js 是否开启 |
page.setOfflineMode |
设置离线模式 |
page.deleteCookie |
删除 cookies |
page.setCookie |
设置 cookies |
对象说明
- Browser: 对应一个浏览器实例,一个 Browser 可以包含多个 BrowserContext
- BrowserContext: 对应浏览器一个上下文会话,就像我们打开一个普通的 Chrome 之后又打开一个隐身模式的浏览器一样,BrowserContext 具有独立的 Session(cookie 和 cache 独立不共享),一个 BrowserContext 可以包含多个 Page
- Page:表示一个 Tab 页面,通过 browserContext.newPage()/browser.newPage() 创建,browser.newPage() 创建页面时会使用默认的 BrowserContext,一个 Page 可以包含多个 Frame
- Frame: 一个框架,每个页面有一个主框架(page.MainFrame()),也可以多个子框架,主要由 iframe 标签创建产生的
- ExecutionContext: 是 javascript 的执行环境,每一个 Frame 都一个默认的 javascript 执行环境
- ElementHandle: 对应 DOM 的一个元素节点,通过该该实例可以实现对元素的点击,填写表单等行为,我们可以通过选择器,xPath 等来获取对应的元素
- JsHandle:对应 DOM 中的 javascript 对象,ElementHandle 继承于 JsHandle,由于我们无法直接操作 DOM 中对象,所以封装成 JsHandle 来实现相关功能
- CDPSession:可以直接与原生的 CDP 进行通信,通过 session.send 函数直接发消息,通过 session.on 接收消息,可以实现 Puppeteer API 中没有涉及的功能
- Coverage:获取 JavaScript 和 CSS 代码覆盖率
- Tracing:抓取性能数据进行分析
- Response: 页面收到的响应
- Request: 页面发出的请求
相关推荐
Puppeteer recorder一个Chrome扩展能记录您的浏览器交互并生成Puppeteer脚本
基于node 使用puppeteer 实现web页面转pdf功能
puppeteer学习的demo,使用puppeteer爬取大众点评的信息,反反爬虫大众点评svg加密,将获取信息存到本地json或写入数据库,有问题私聊,或者去我博客留言,谢谢
基于Puppeteer的前端性能测试是一种自动化的方法,用于评估和优化Web应用程序的性能。Puppeteer是一个由Google Chrome团队开发的Node库,它提供了一组高级API来控制Headless Chrome或Chromium浏览器,使得开发者能够...
利用puppeteer工具,可以在chrome上自动填写页面,同时也可以利用chrome的devtool测试mobile和iPad
一些简单的puppeteer样例,适用简单的网站自动化测试以及爬虫工作
Puppeteer记录器是一个Chrome扩展程序,可记录您的浏览器交互并生成Puppeteer脚本。 编写用于抓取,测试和监视的Puppeteer脚本可能很棘手。 记录器/代码生成器可能会有所帮助。 该扩展程序具有以下功能:-记录点击,...
基于电子记录器。用法const { record } = require ( 'puppeteer-recorder' ) ;await record ( { browser : null , // Optional: a puppeteer Browser instance, page : null , // Optional: a puppeteer Page ...
puppeteer爬虫,puppeteer-deep-master.zip npm run sf-juejin (推荐segmentfault的热门文章到掘金) npm run monitor (前端监控、报警) npm run es6 (爬取了阮一峰老师的《ES6标准入门》并打印PDF) npm run zhentaoo...
利用Puppeteer 这个工具,我们能做一个操纵页面的人。Puppeteer是一个Nodejs的库,支持调用Chrome的API来操纵Web,相比较Selenium或是PhantomJs,它最大的特点就是它的操作Dom可以完全在内存中进行模拟既在V8引擎中...
自动化操作puppeteer,一次编写,多次使用,适合解决,初学者遇到的各种疑难杂症【注:此示例仅供学习专用。】
Nuxtjs零配置测试运行Jest和Puppeteer
website-scraper-puppeteer-master.rar
npm install puppeteer安装很多人都安装失败,本人也踩了坑过来。本人已安装成功,现在将安装包直接分享给大家使用。 使用方法:下载压缩包,解压到你工程项目的..\node_modules\puppeteer文件夹下.
Puppeteer Cluster会重用Chromium,并在出现错误的情况下重新启动浏览器。 这个图书馆做什么? 抓取错误的处理 发生崩溃时自动重启浏览器 如果作业失败,可以自动重试 可供选择的不同并发模型(页面,上下文,...
自动化操作puppeteer,一次编写,多次使用,适合解决,初学者遇到的各种疑难杂症【注:此示例仅供学习专用。】
如何使用Puppeteer拍摄网页屏幕截图并生成动态Open ... 该存储库包含一些示例代码,说明如何开始使用Puppeteer生成浏览器页面的屏幕截图。 要求 Puppeteer使用Node执行。 如果你想用木偶举办一个项目,你需要使用可以
Puppeteer是一个Node库,它提供了一个高级API来通过DevTools协议控制Chromium或Chrome。
打印来自木偶的日志安装npm i vbarbarosh/puppeteer-log基本用法#!/usr/bin/env node-esmimport cli from '@vbarbarosh/node-cli' ;import puppeteer from 'puppeteer' ;import puppeteer_log from '@vbarbarosh/...