SCF中可以执行 Chromium
进行网页访问等操作,有两种使用方法:
- 把 Chromium 作为Layer进行安装
- 把 Chromium 放到共享存储CFS从而避免代码包的限制
注意browser
实例在多次请求之前是可以复用的,没必要每次都要新建一个浏览器实例,可以通过缓存 browser
到全局变量中实现多次请求之间复用,只有在全局变量未设置的时候再进行初始化。
两种方式 chrome
可执行文件的位置不同,需要修改对应的代码配置:
app/controllers/home.js:
const browser = await puppeteer.launch({
// 使用Layer的方式部署 driver,可以直接通过 /opt目录引用
// 注意⚠️:文件路径中不需要添加Layer名称
executablePath: "/opt/chrome-linux/chrome",
// 使用 CFS 的方式部署 driver,默认情况可以直接通过 /mnt 目录引用
// executablePath: "/mnt/chrome-linux/chrome",
headless: true,
args: ["--no-sandbox", "--disable-setuid-sandbox", "--disable-dev-shm-usage"],
defaultViewport: {
width: 1920,
height: 1080,
},
});
...
}
-
创建Zip包
zip -r headless_chrome_nodejs.zip . -x "*node_modules*" -x "*.git*"
-
创建 Web 函数
函数类型 Web函数 运行环境 Nodejs 12.16 内存 512MB 执行超时时间 10秒
-
部署并自动在线安装依赖
依赖较多,请耐心等待:
或者通过 Shell 的方式在终端按照
export PUPPETEER_SKIP_DOWNLOAD='true' cd src npm install
备注:也可以直接下载经过测试验证的 chromium 二进制文件:
chrome_r961656: Download LInk
下载之后,可以用于创建 Layer 并绑定到函数进行使用
puppeteer
之间的 映射关系:
['100.0.4889.0', 'v13.5.0'],
// 该版本为Demo的Pupeteer版本
['99.0.4844.16', 'v13.2.0'],
['98.0.4758.0', 'v13.1.0'],
['97.0.4692.0', 'v12.0.0'],
['93.0.4577.0', 'v10.2.0'],
['92.0.4512.0', 'v10.0.0'],
-
链接:https://vikyd.github.io/download-chromium-history-version/#/
-
搜索版本对应的
Build
-
获得下载链接,例如:r961656
通过控制台创建有50MB的限制,需要选择通过COS创建Layer的方式,提前把 Zip 文件放到 COS,然后按照下面的方式创建 Layer:
-
⚠️ 如果总的文件大小超过500MB,需要把 Chromium 放到 CFS上,减少代码包的体积 -
创建CFS之后,可以通过虚拟机挂载 CFS,然后把下载的Zip包上传到对应的目录
-
然后配置函数,函数启动的时候自动挂载 CFS:
获取APIGW地址,运行以下命令:
curl https://service-xxxxx-1253970226.gz.apigw.tencentcs.com/release/test
## 返回通过Headless Chrome抓取的标题
[{"page_title":"百度一下,你就知道"}]
配置环境变量:
DEBUG=puppeteer:*
报错信息:
[Error: EACCES: permission denied, open '/mnt/xxx.jpg'] {
errno: -13,
code: 'EACCES',
syscall: 'open',
path: '/mnt/xxx.jpg'
}
检查步骤:
- 查看函数的角色配置:查看云函数的执行角色配置,是否设置为
SCF_QcsRole
- 查看角色权限:在
CAM
查看该角色是否关联了 CFS 的写入权限 - 查看文件权限:在一台虚拟机挂载 CFS 之后,运行命令更改文件的用户名和用户组
## 其中 10000:10000 为云函数读写 CFS 文件时的用户名和用户组Id
chown 10000:10000 -R /mnt/foler
ls -al /mnt/folder