文档章节

三分钟学会如何在函数计算中使用 puppeteer

阿里云云栖社区
 阿里云云栖社区
发布于 06/21 17:59
字数 2411
阅读 14
收藏 0
点赞 0
评论 0

摘要: 使用 puppeteer 结合函数计算,可以快速的构建弹性的服务完成各种功能,包括:生成网页截图或者 PDF、高级爬虫,可以爬取大量异步渲染内容的网页、模拟键盘输入、表单自动提交、登录网页等,实现 UI 自动化测试和捕获站点的时间线,以便追踪你的网站,帮助分析网站性能问题

简介

使用 puppeteer 结合函数计算,可以快速的构建弹性的服务完成各种功能,包括:

  • 生成网页截图或者 PDF
  • 高级爬虫,可以爬取大量异步渲染内容的网页
  • 模拟键盘输入、表单自动提交、登录网页等,实现 UI 自动化测试
  • 捕获站点的时间线,以便追踪你的网站,帮助分析网站性能问题

接下来,将基于一个脚手架项目开发我们自己 puppeteer 项目。

下载项目

>>> git clone -o starter-kit https://github.com/awesome-fc/puppeteer-fc-starter-kit.git your_project_name

项目结构

├── lib                         chrome headless 依赖的共享库,打包的时候,拷贝到打包项目的根目录下
├── chrome                           
│   ├── buildChrome.sh          编译 chrome headless shell 脚本,基于它,可以编译最新的版本
│   └── headless_shell.tar.gz   编译后的 chrome headless 二进制打包文件
├── src
│   ├── index.js                函数调用入口文件,函数 handler 为 index.handler,您的业务代码写在这里
│   └── starter-kit
│       ├── config.js           通过环境变量,获取相关配置属性,如:chrome 执行目录和安装目录等配置
│       ├── local.js            本地测试操作 chrome headless 的 API 是否正确,通过执行命令:npm run local
│       └── setup.js            安装 chrome headless 相关逻辑代码,如:基于 OSS 安装或者本地目录安装
├── package.json
└── package.zip                 输出函数计算打包文件,通过命令:npm run package 或 npm run package-nochrome 

如何写业务代码

index.js 文件

const setup = require('./starter-kit/setup');

exports.handler = async (event, context, callback) => {
  const browser = await setup.getBrowser(context);
  exports.run(browser).then(
    (result) => callback(null, result)
  ).catch(
    (err) => callback(err)
  );
};

exports.run = async (browser) => {
  // 实现您自己的业务代码
  // 下面是一个示例代码,需要替换成您自己的业务代码
  // 示例实现了对固定网页截图并返回图片的功能
  const page = await browser.newPage();
  await page.goto('https://fc.console.aliyun.com');
  return page.screenshot({
    clip: {
      x: 200,
      y: 60,
      width: 780,
      height: 450,
    },
  });
};

本地测试

执行命令: npm run local 。测试您操作 chrome headless 的相关 api 是否正确运行。

编译打包

包含 chrome headless

执行命令:npm run package 。命令会将 chrome headless 文件一起打包进项目,放在项目根目录,函数执行的时候,默认将 chrome headless 安装到 /tmp 目录。

不包含 chrome headless

执行命令:npm run package-nochrome 。命令不会将 chrome headless 文件一起打包进项目,你需要额外将 chrome-headless 上传到 OSS,通过环境变量告诉函数如何从 OSS 下载并安装,默认将 chrome headless 安装到 /tmp 目录。为函数计算设置环境变量:

  • CHROME_BUCKET(必填): chrome headless 上传到 OSS 的 bucket
  • CHROME_REGION(必填): chrome headless 上传到 OSS 的 region
  • CHROME_KEY(必填): chrome headless 上传到 OSS 的 key。 默认值: headless_shell.tar.gz

部署

编译打包输出的文件:package.zip,通过函数计算控制台或者 fcli 命令工具上传已打包文件。fcli 上传已打包文件命令:

# 在相应 service 目录下
>>> mkf myFunction -h index.handler -f package.zip -t nodejs8 # 代码在本地的 package.zip 中

为什么要使用函数计算

函数计算是一个相对较新的事物,可能大部分开发人员或架构师对它很陌生。微服务架构是当下很流行的一种系统架构,微服务架构有没有不够完美的地方?答案是肯定的。基于微服务架构,我们需要考虑使用什么微服务框架来架构系统、需要多少台服务器、如何有效减轻运维负担等一些列问题。另外,按照《福布斯》杂志的统计,在商业和企业数据中心的典型服务器仅提供 5%~15% 的平均最大处理能力的输出。这无疑是一种资源的巨大浪费。

有没有办法解决上面的不足?答案也是肯定的,阿里云函数计算就是在这样的背景下应运而生的。如果把云计算理解成一个执行环境,那么,在这个环境里,函数(即业务逻辑的载体)+ 数据(即跟业务相关的输入与输出)就是应用的核心,有了函数、数据、事件这三者,其它任何代码和框架,无非是整个应用的胶水和UI罢了。那么,最理想的情况就是用最少的时间写胶水,将更多的时间投入到核心应用的开发中,甚至,彻底实现整个软件栈的微服务化。函数计算就是这里的胶水。

开发效率

项目开发效率 传统微服务方式 函数计算方式
采购服务器等基础设施 需要 不需要
管理服务器等基础设施 需要 不需要
开发业务服务模块 需要 需要
部署业务服务模块 需要 需要,但是很简单,提供了很多工具
通过 nginx 搭建反向代理、https 和负载均衡 需要 不需要,通过阿里云 API 网关或函数 HTTP 触发器可以实现
搭建相关日志服务 需要 不需要,通过日志开关开启日志服务
配置安全访问规则 需要 不需要,自带基础安全访问配置,API 网关提供更多的配置
运维负担
开发效率 高,通常几天就能完成

可靠性

项目可靠性 传统微服务方式 函数计算方式
峰值压力 当峰值压力突增时,计算资源扩容不及时容易导致服务过载 弹性伸缩,面对峰值压力
错误处理 需要自行处理服务器宕机,进程崩溃等问题 无需处理服务器等故障,函数计算实现基础设施的容错
项目架构 基础设施管理比较复杂 系统架构经过大量项目的验证和长时间的打磨,相对稳定可靠很多

成本

项目成本 传统微服务方式 函数计算方式
采购服务器等基础设施成本 成本高,利用率低
代码开发成本 成本高,包含基础架构代码和业务代码 成本低,只需关注业务代码开发
函数计算成本 成本低,按需付费,每月还有一定免额
运维成本 成本高,难度大 成本低,难度很小,甚至可以不需要专门的运维人员
集成阿里云其他产品成本,如 OSS 和RDS 等 成本高 成本低,提供对阿里云其他产品无缝集成

安全

项目安全 传统微服务方式 函数计算方式
身份认证和访问控制 需自行实现 除非您显式的允许匿名调用函数,函数计算将对每一个 API 调用进行身份验证。只有获得您的显式授权(借助于阿里云访问控制服务,RAM),您的函数才可以访问其他云服务资源或者被其他用户/云服务调用。借助阿里云 API 网关,您也可以使用 OpenID 等机制对函数调用进行身份验证
操作追踪和审计 需自行实现 需自行实现
数据安全 需自行实现 通过使用访问控制授权和函数计算环境变量等功能,您不必再将访问凭证等敏感信息保存在代码中。所有您借助函数计算服务持久化保存的数据,包括代码、环境变量等等,都被加密存储。系统在运行代码之前,将对代码进行完整性检测
运行时安全 需自行实现 每个函数都在独立的、隔离的环境中被执行。函数计算提供与阿里云弹性计算(ECS)相同的隔离强度。函数计算会周期性的重置运行时环境,并自动更新操作系统以及运行时依赖软件的安全补丁
异常响应 需自行实现 函数计算允许您设置资源使用的上限,确保您的费用消耗可控。同时,函数计算提供函数调用次数,流控次数,错误率等指标。借助云监控,您可以为相关指标设置监控报警,快速响应异常情况

总结

函数计算有如下优势:

  • 无需采购和管理服务器等基础设施
  • 专注业务逻辑的开发
  • 提供日志查询、性能监控、报警等功能快速排查故障
  • 以事件驱动的方式触发应用响应用户请求
  • 毫秒级别弹性伸缩,快速实现底层扩容以应对峰值压力
  • 按需付费。只需为实际使用的计算资源付费,适合有明显波峰波谷的用户访问场景

原文链接

本文为云栖社区原创内容,未经允许不得转载。

© 著作权归作者所有

共有 人打赏支持
阿里云云栖社区
粉丝 30
博文 576
码字总数 1248216
作品 0
朝阳
函数计算中使用 puppeteer.js

puppeteer.js github 地址:https://github.com/GoogleChrome/puppeteer API: https://github.com/GoogleChrome/puppeteer/blob/v1.4.0/docs/api.md 函数计算文档:https://help.aliyun.com......

木香丘
06/12
0
0
三分钟GET一个新技能┃03 自律神器:只花3分钟,每天至少帮你省出三小时

文/职场逗伴匠 1. 大家听说过“下雨四大怪”么? 我听说过。 啥意思?这所谓的“下雨四大怪”分别是, ①下雨必没伞 ②买伞必雨停 ③出门伞必丢 ④带伞必晴天 有同感,扎心了?尴尬不...... ...

职场逗伴匠
06/05
0
0
CentOS6.6的重启、注销、关机命令

1. 可以查看shutdown命令如何使用 2.重启命令 现在立即重启,也可以用reboot命令 三分钟后重启 在19:30时将重启计算机 将在19:30时重启的任务放到后台去,用户可以继续操作终端。 3.关机命令...

王佳凱
2017/04/14
0
0
ECMAScript7 async/await 异步解决方案

Async 函数作为异步解决方案的最优解,async/await 特性能让我们编写出相比回调地狱和 Promise 链式调用更直观、更容易理解的代码,Async 函数返回一个 Promise 对象,可以使用 方法添加回调...

Nian糕
06/12
0
0
【BZOJ1857】传送带“编程题”

题面 Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段。两条传送带分别为线段AB和线段CD。lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R...

小蒟蒻yyb的博客
2017/12/20
0
0
hihoCoder #1142 : 三分求极值

#1142 : 三分·三分求极值 题目链接:https://hihocoder.com/problemset/problem/1142 【思路】 二分法作为分治中最常见的方法,适用于单调函数,逼近求解某点的值。但当函数是凸形函数时,二...

angel_kitty
2017/03/17
0
0
从零基础学三分查找

转载请注明:http://www.cnblogs.com/ECJTUACM-873284962/ 今晚是我们学长第二次讲课,讲了一个三分!认真听了一下,感觉不是很难,可能会比二分还简单些!我就把上课讲的内容归纳为一篇文章...

angel_kitty
2017/03/11
0
0
[译] 使用 Puppeteer 和 Jest 测试你的 React 应用

原文地址:Testing your React App with Puppeteer and Jest 原文作者:Rajat S 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m… 译者:jonjia 校对者:sunhaokk 老教授 如何...

jonjia
05/14
0
0
openhwapi/HYLI_SMART_FAN

#HYLISMARTFAN 这是三分钟教你学会智能硬件系列的第三篇。第一篇教大家DIY一个蓝牙防丢器,不过那里的硬件部分仅仅是连连线而已;第二篇教自制一个蓝牙计步手环,那里重点放到安卓炫酷客户端...

openhwapi
2016/05/11
0
0
当人工智能又入侵了厨房,你的早餐和沙拉将这样被协作出来?

  有一个人工智能系统可以窥视未来,预测你将要做什么。   至于你信不信,它已经被开发出来。看到后充满了好奇和一丝期待,但也会细思极恐。   这个AI,它不能穿越时间,也不能接管世界...

遇见人工智能
06/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

云拿 无人便利店

附近(上海市-航南路)开了家无人便利店.特意进去体验了一下.下面把自己看到的跟大家分享下. 经得现场工作人员同意后拍了几张照片.从外面看是这样.店门口的指导里强调:不要一次扫码多个人进入....

周翔
10分钟前
0
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
24分钟前
0
0
npm profile 新功能介绍

转载地址 npm profile 新功能介绍 npm新版本新推来一个功能,npm profile,这个可以更改自己简介信息的命令,以后可以不用去登录网站来修改自己的简介了 具体的这个功能的支持大概是在6这个版...

durban
35分钟前
0
0
Serial2Ethernet Bi-redirection

Serial Tool Serial Tool is a utility for developing serial communications, custom protocols or device testing. You can set up bytes to send accordingly to your protocol and save......

zungyiu
41分钟前
0
0
python里求解物理学上的双弹簧质能系统

物理的模型如下: 在这个系统里有两个物体,它们的质量分别是m1和m2,被两个弹簧连接在一起,伸缩系统为k1和k2,左端固定。假定没有外力时,两个弹簧的长度为L1和L2。 由于两物体有重力,那么...

wangxuwei
56分钟前
0
0
apolloxlua 介绍

##项目介绍 apolloxlua 目前支持javascript到lua的翻译。可以在openresty和luajit里使用。这个工具分为两种模式, 一种是web模式,可以通过网页使用。另外一种是tool模式, 通常作为大规模翻...

钟元OSS
今天
0
0
Mybatis入门

简介: 定义:Mybatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。 途径:MyBatis通过XML文件或者注解的形式配置映射,实现数据库查询。 特性:动态SQL语句。 文件结构:Mybat...

霍淇滨
今天
0
0
开发技术瓶颈期,如何突破

前言 读书、学习的那些事情,以前我也陆续叨叨了不少,但总觉得 “学习方法” 就是一个永远在路上的话题。个人的能力、经验积累与习惯方法不尽相同,而且一篇文章甚至一本书都很难将学习方法...

_小迷糊
今天
0
0
安装tensorflow-XXX报错

报错: tensorflow-0.5.0-cp27-none-linux_x86_64.whl is not a supported wheel on this platform. 解决: wget https://bootstrap.pypa.io/get-pip.py sudo python2.7 get-pip.py sudo p......

Yao--靠自己
今天
0
0
JVM学习手册(一):JVM模型

一直从事JAVA开发,天天和JVM打交道,仔细想想对JVM还真的不是特别了解,实在是不应该.周六看了许多资料,也算有点心得,记录一下。 JVM内存模型分为5个区域:方法区,堆,虚拟机栈,本地方法栈,程序计...

勤奋的蚂蚁
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部