puppeteer 提供了两种方法用于创建一个 Browser 实例:
- puppeteer.connect: 连接一个已经存在的 Chrome 实例
- puppeteer.launch: 每次都启动一个 Chrome 实例
方式一:使用 puppeteer.launch 启动一个 Chrome 实例
const puppeteer = require('puppeteer'); let request = require('request-promise-native'); //使用 puppeteer.launch 启动 Chrome (async () => { const browser = await puppeteer.launch({ headless: false, //有浏览器界面启动 slowMo: 100, //放慢浏览器执行速度,方便测试观察 args: [ //启动 Chrome 的参数 '–no-sandbox', '--window-size=1280,960' ], }); const page = await browser.newPage(); await page.goto('https://www.baidu.com'); await page.close(); await browser.close(); })();
方式二:使用 puppeteer.connect 连接一个已经存在的 Chrome 实例
(async () => { //通过 9222 端口的 http 接口获取对应的 websocketUrl let version = await request({ uri: "http://127.0.0.1:9222/json/version", json: true }); //直接连接已经存在的 Chrome let browser = await puppeteer.connect({ browserWSEndpoint: version.webSocketDebuggerUrl }); const page = await browser.newPage(); await page.goto('https://www.baidu.com'); await page.close(); await browser.disconnect(); })();
这两种方式的对比:
- puppeteer.launch 每次都要重新启动一个 Chrome 进程,启动平均耗时 100 到 150 ms,性能欠佳
- puppeteer.connect 可以实现对于同一个 Chrome 实例的共用,减少启动关闭浏览器的时间消耗
- puppeteer.launch 启动时参数可以动态修改,而puppeteer.connect 不可以
- 通过 puppeteer.connect 我们可以远程连接一个 Chrome 实例,部署在不同的机器上
- puppeteer.connect 多个页面共用一个 chrome 实例,偶尔会出现 Page Crash 现象,需要进行并发控制,并定时重启 Chrome 实例