Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

ServerlessBravo/scf-nodejs-headless-chrome-demo

Repository files navigation

通过云函数运行 Headless Chromium

简介

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,
      },
    });
    ...
}

部署函数

  1. 创建Zip包

    zip -r headless_chrome_nodejs.zip . -x "*node_modules*" -x "*.git*"
  2. 创建 Web 函数

    函数类型	    Web函数
    运行环境	    Nodejs 12.16
    内存	    512MB
    执行超时时间  10秒
  3. 部署并自动在线安装依赖

    依赖较多,请耐心等待:

    或者通过 Shell 的方式在终端按照

    export PUPPETEER_SKIP_DOWNLOAD='true'
    cd src
    npm install

下载 Chromium

备注:也可以直接下载经过测试验证的 chromium 二进制文件:

chrome_r961656: Download LInk

下载之后,可以用于创建 Layer 并绑定到函数进行使用

1.找到对应的 Chromium 版本

⚠️ 注意下载的版本和 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'],

2.找到对应的 Bulild

3.下载对应文件:

通过层安装

1. 创建层

通过控制台创建有50MB的限制,需要选择通过COS创建Layer的方式,提前把 Zip 文件放到 COS,然后按照下面的方式创建 Layer:

2. 绑定层

通过CFS 安装

  • ⚠️ 如果总的文件大小超过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:*

CFS 写入出错

报错信息:

 [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

更多用法

puppeteer/puppeteer

Releases

No releases published

Packages

No packages published