当前位置:首页 > Web开发 > 正文

有了 serverless,前端也可以快速开发一个 Puppeteer 网页截图服务

2024-03-31 Web开发

puppeteer 官网的介绍如下:
Puppeteer is a Node library which provides a high-level API to control Chrome or Chromium over the DevTools Protocol. Puppeteer runs headless by default, but can be configured to run full (non-headless) Chrome or Chromium.

通俗描述就是:Puppeteer 可以将 Chrome 或者 Chromium 以无界面的方式运行(当然也可以运行在有界面的服务器上),然后可以通过代码控制浏览器的行为,即使是非界面的模式运行,Chrome 或 Chromium 也可以在内存中正确渲染网页的内容。
那么 Puppeteer 能做什么呢?

生成网页截图或者 PDF

抓取 SPA(Single-Page Application) 进行服务器渲染(SSR)

高级爬虫,可以爬取大量异步渲染内容的网页

模拟键盘输入、表单自动提交、登录网页等,实现 UI 自动化测试

捕获站点的时间线,以便追踪你的网站,帮助分析网站性能问题

本文选择截图场景作为演示。

废话不多说了,我们直接给大家介绍下如何用函数计算产品来快速部署一个 Puppeteer Web 应用。

如何快速部署一个分布式 Puppeteer Web 应用?

为了快速部署分布式 Puppeteer Web 应用,本文以函数计算服务为例来做展示。

函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。函数计算更多信息参考。

有了函数计算服务,我们这里目标是搭建一个分布式应用,但做的事情其实很简单,那就是写好业务代码,部署到函数计算,仅此而已。

使用函数计算后,我们的系统架构图如下:

技术图片

效果演示

可以直接通过以下链接查看效果:
https://1911504709953557.cn-hangzhou.fc.aliyuncs.com/2016-08-15/proxy/puppeteer-test/html2png/?url=http://www.mamicode.com/https:/www.aliyun.com/product/fc
PS:第一次请求可能会有几秒的冷启动时间,通过使用预留模式可以完全去除冷启动,这题超纲,下次再讲。

搭建步骤步骤:

整体流程如下图所示:

技术图片

其中,需要我们操作的只有 Fun Init、Fun Install 以及 Fun Deploy 命令,每个的步骤内容都会由这三个命令自动完成。

1. 工具安装

安装 Fun 工具

建议直接从这里下载二进制可执行程序,解压后即可直接使用。下载地址。

安装 Docker
可以按照进行安装。

2. 初始化项目:

通过 Fun 工具,使用下面的命令可以快速初始化一个 Puppeteer Web 应用的脚手架:

fun init -n puppeteer-test http-trigger-node-puppeteer

其中 -n puppeteer-test? 表示初始化项目的目录名称, http-trigger-node-puppeteer? 表示要使用的模板名称,可以省略该名称,省略后,可以从终端提示的列表中自行选择需要的模板。
执行完毕后,可以看到如下的目录结构:

. ├── index.js ├── package.json └── template.yml

相比较于传统的 puppeteer 应用,这里仅仅多了一个 template.yml 文件,用于描述函数计算的资源。
而 index.js 就是我们的业务代码了,可以按照 Puppeteer 官方帮助文档的要求书写自己的业务代码,这里不再重复阐述,核心代码如下:

const browser = await puppeteer.launch({ headless: true, args: [ '--no-sandbox', '--disable-setuid-sandbox', ] }); const page = await browser.newPage(); await page.emulateTimezone('Asia/Shanghai'); await page.goto('https://www.baidu.com', { 'waitUntil': 'networkidle2' }); await page.screenshot({ path: '/tmp/example', fullPage: true, type: 'png' }); await browser.close();

package.json 内容如下:

{ ... ... "dependencies": { "puppeteer": "^2.0.0" }, ... ... }

可以看到,在 package.json 中声明了 puppeteer 的依赖。这个也是我们使用 node 开发时的标准做法,并无特别之处。

3. 一键安装依赖

puppeteer 的安装,即使是在传统的 linux 机器上,也不是那么的轻松。因为 puppeteer 本身依赖了非常多的系统库,要安装哪些系统库、如何安装这些系统库成了一个比较头痛的问题。

好在函数计算命令行工具 Fun 已经集成了 Puppeteer 的解决方案,只要 package.json 中包含了 puppeteer 依赖,然后使用 fun install -d 即可一键安装所有系统依赖。

fun install -d 4. 本地运行、调试函数

Puppeteer 的本地运行、调试方法与这里介绍的完全一致,我们就不再重复介绍。我们这里只演示下运行效果:

技术图片

5. 一键部署应用

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/40584.html