Puppeteer 是一个 Node 库,它提供了一个高级 API 来经过 DevTools 协议控制 Chromium 或 Chrome。node
Puppeteer 是 Google Chrome 团队官方的无界面(Headless)Chrome 工具。正由于这个官方声明,许多业内自动化测试库都已经中止维护,包括 PhantomJS。Selenium IDE for Firefox 项目也由于缺少维护者而终止。chrome
puppetter能够生成页面的截图和PDF,抓取SSR,抓取网站内容,模拟登录等。puppetter能够作这么多少玩的事情,我开始跃跃试试,从新写一套爬虫。开始行动!npm
Puppeteer 要求使用 Node v6.4.0,但由于文中大量使用 async/await,须要 Node v7.6.0 或以上。json
$ mkdir puppeteer-demo
$ cd puppeteer-demo
复制代码
$ npm init
复制代码
因为 Puppeteer并非稳定的版本并且天天都在更新,因此若是你想要最新的功能能够直接经过 GitHub 的仓库安装。浏览器
$ npm i --save puppeteer
复制代码
安装时可能会出现如下报错:bash
ERROR: Failed to download Chromium r588429! Set "PUPPETEER_SKIP_CHROMIUM_DOWNLOAD" env variable to skip download.
复制代码
Chromium浏览器有58M左右,可能会出现安装失败的状况。app
解决方法一:less
vi .npmrc
type puppeteer_download_host = https://npm.taobao.org/mirrors
yarn add puppeteer -D
复制代码
代理puppeteer下载地址异步
解决方法二:官方建议设置环境变量 PUPPETEER_SKIP_CHROMIUM_DOWNLOAD
忽略浏览器的下载async
env PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true npm i puppeteer -D
复制代码
引伸一下~
Puppeteer 寻找某些环境变量来帮助其操做。 若是 puppeteer 在环境中没有找到它们,这些变量的小写变体将从 npm 配置 中使用。
引伸结束~
忽略了Chromium浏览器下载后,咱们成功下载好了puppeteer。而后去找puppeteer安装包package.json中对应的chrome版本。(puppeteer/package.json->puppeteer.chromium_revision,具体见lib/Downloader.js
)
这里的依赖chromium版本是588429,
接着去官网手动下载Chromium文件,下载地址:npm.taobao.org/mirrors/chr… 解压后放在本地
1、直接放在puppeteer默认读取目录下
例如:node_modules\puppeteer.local-chromium\win64-526987(系统类型-版本号)\chrome-win32(下载的文件名)\
2、放在其余目录
我将Chromium文件直接放在项目目录puppeteer-demo下,运行时须要使用puppeteer.executablePath()设置路径参数
const pathToExtension = require('path').join(__dirname, 'chrome-mac/Chromium.app/Contents/MacOS/Chromium');
puppeteer.launch({executablePath: pathToExtension});
复制代码
puppeteer.executablePath()
returns: A path where Puppeteer expects to find bundled Chromium. Chromium might not exist there if the download was skipped with PUPPETEER_SKIP_CHROMIUM_DOWNLOAD.
新建screenShot.js,引入puppeteer包而后配置Chromium启动路径。 调用puppeteer.launch
方法启动Chromium。
这里须要提醒注意申明的函数是一个async函数,使用了ES 2017 async/await
特性。该函数是一个异步函数,会返回一个Promise。若是async最终顺利返回值,Promise则能够顺利reslove,获得结果;不然将会reject一个错误。
由于咱们使用了async函数,咱们使用await来暂停函数的执行,直到Promise返回一个browser对象。
const puppeteer = require('puppeteer');
(async () => {
const pathToExtension = require('path').join(__dirname, 'chrome-mac/Chromium.app/Contents/MacOS/Chromium');
const browser = await puppeteer.launch({
headless: false,
executablePath: pathToExtension
});
const page = await browser.newPage();
await page.goto('https://www.baidu.com');
await page.setViewport({width: 1000, height: 500});
await page.screenshot({path: 'example.png'});
await browser.close();
})();
复制代码