在 AWS Lambda 上运行 Crawlee 浏览器爬虫:Playwright + Chromium 的完整部署指南
2026/9/13 3:56:55 网站建设 项目流程

在 AWS Lambda 上运行 Crawlee 浏览器爬虫:Playwright + Chromium 的完整部署指南

【免费下载链接】crawleeCrawlee—A web scraping and browser automation library for Node.js to build reliable crawlers. In JavaScript and TypeScript. Extract data for AI, LLMs, RAG, or GPTs. Download HTML, PDF, JPG, PNG, and other files from websites. Works with Puppeteer, Playwright, Cheerio, JSDOM, and raw HTTP. Both headful and headless mode. With proxy rotation.项目地址: https://gitcode.com/GitHub_Trending/cr/crawlee

Crawlee 的PlaywrightCrawler可以在 AWS Lambda 无服务器环境中运行,但比普通 Node.js 爬虫多一个关键步骤:除了代码与依赖,还必须把浏览器二进制一并上传。本指南以 Crawlee 3.16 版本为准,讲解如何借助@sparticuz/chromium包管理 Chromium 二进制、通过 Lambda Layer 与 S3 绕过 50MB 上传限制、用独立Configuration隔离存储,并最终部署一个可在 AWS 上执行并返回爬取数据的 Lambda 函数。读完本文,你将掌握一套可直接落地的"Lambda + 浏览器爬虫"部署流程。

为什么在 Lambda 上跑浏览器爬虫"有点复杂"

在 AWS Lambda 上运行启用浏览器的 Crawlee 爬虫并不难,但比本地运行多了一个核心约束:Lambda 的执行环境是精简的,不会预装任何浏览器。你不仅要把业务代码和node_modules依赖打进去,还必须把 Chromium(或 Chrome)的浏览器二进制一起上传到 AWS。

传统做法是把node_modules与浏览器二进制直接打进部署包,但浏览器动辄上百 MB,会遇到两个问题:

  • AWS Lambda 对直接上传的部署包有大小限制(函数代码压缩后约 50MB,直接上传更小);
  • 打包过大会拖慢每次冷启动的解压与加载时间。

因此官方推荐的思路是:代码与依赖分离——把依赖(含浏览器二进制)做成Lambda Layer,函数主体只保留业务代码,两者独立上传、按需挂载。

管理浏览器二进制:@sparticuz/chromium

好在社区已经有现成的 NPM 包帮助我们管理浏览器二进制的安装:@sparticuz/chromium

这个包内置了经过brotli 压缩的 Chromium 二进制。当它在 Lambda 环境中被调用时,会将这些二进制解压到 Lambda 的/tmp/临时目录下,并返回可执行文件的路径。这样我们就不需要自己维护"浏览器下载 + 压缩 + 上传"的繁琐流程。

把它加入项目依赖,并把node_modules打成压缩包即可:

# 安装依赖包 npm i -S @sparticuz/chromium # 将依赖打进 zip(供后续上传为 Lambda Layer) zip -r dependencies.zip ./node_modules

注意:zip命令以 macOS / Linux 环境为例;在 Windows 上可使用 PowerShell 的Compress-Archive达到同样效果。

通过 S3 上传 Lambda Layer(绕过 50MB 限制)

接下来要把dependencies.zip作为Lambda Layer上传到 AWS。这里有一个坑:直接上传 Layer 存在约 50MB 的限制,而压缩后的 Chromium 构建本身就接近这个大小,单靠直接上传很容易失败。

解决方法是"曲线救国":先把dependencies.zip作为对象上传到S3 存储桶,然后在创建 Lambda Layer 时提供 S3 对象的链接,由 AWS 从 S3 拉取并注册为 Layer。

# 示例:将 dependencies.zip 上传到 S3(桶名请替换为你自己的桶) aws s3 cp dependencies.zip s3://your-bucket/layers/dependencies.zip # 通过 S3 对象创建 Lambda Layer aws lambda publish-layer-version \ --layer-name crawlee-dependencies \ --description "Crawlee dependencies with Chromium" \ --content S3Bucket=your-bucket,S3Key=layers/dependencies.zip \ --compatible-runtimes nodejs18.x nodejs20.x

Layer 创建成功后,将其挂载到你的 Lambda 函数,函数运行时即可访问 Layer 中的node_modules以及解压后的 Chromium 二进制。

更新 Crawlee 代码

部署到 Lambda 前,业务代码需要做三处关键调整,下面逐一说明。

1. 为爬虫创建独立的 Configuration 实例

默认情况下,Crawlee 使用一个全局单例Configuration(见 Configuration 类定义)。但在 Lambda 环境中,同一个执行环境可能被多个并发调用复用,不同爬虫实例会共享全局存储,可能相互干扰。

解决办法是给每个PlaywrightCrawler传入独立的Configuration实例,并设置persistStorage: false

// For more information, see https://crawlee.dev/ import { Configuration, PlaywrightCrawler } from 'crawlee'; import { router } from './routes.js'; const startUrls = ['https://crawlee.dev']; const crawler = new PlaywrightCrawler({ requestHandler: router, }, new Configuration({ persistStorage: false, })); await crawler.run(startUrls);

为什么需要persistStorage: false?从源码可以看到,persistStorage的默认值是true,对应环境变量CRAWLEE_PERSIST_STORAGE(见 configuration.ts)。而存储后端的选择逻辑在 service_locator.ts 中:

  • persistStorage: true(默认)→ 使用FileSystemStorageBackend,数据集、请求队列、键值存储都会落盘到本地目录(默认./storage,由storageDir配置项控制);
  • persistStorage: false→ 使用MemoryStorageBackend,所有数据保存在内存中。

Lambda 的磁盘是临时的(/tmp空间有限且实例销毁即清空),将数据持久化到本地文件系统既浪费空间也没有意义。关闭持久化后,数据保留在内存中,爬虫结束后由你主动从Dataset中取出并返回。

2. 注入 Chromium 可执行路径与启动参数

现在需要把@sparticuz/chromium提供的 Chromium 路径交给 Playwright。同时,AWS Lambda 执行环境缺少 GPU 加速等硬件支持,需要把包内置的aws_chromium.args传给浏览器的args参数,让 Chromium 以兼容 Lambda 的软件渲染方式运行:

// For more information, see https://crawlee.dev/ import { Configuration, PlaywrightCrawler } from 'crawlee'; import { router } from './routes.js'; import aws_chromium from '@sparticuz/chromium'; const startUrls = ['https://crawlee.dev']; const crawler = new PlaywrightCrawler({ requestHandler: router, launchContext: { launchOptions: { executablePath: await aws_chromium.executablePath(), args: aws_chromium.args, headless: true } } }, new Configuration({ persistStorage: false, }));

这里用到的launchContext.launchOptions与 Playwright 原生的browserType.launch选项完全兼容。从 PlaywrightLauncher 的实现 可以看到,launchContext中的launchOptions会被透传给 Playwright 的启动调用,同时 Crawlee 还会根据配置解析默认的executablePath;而我们显式传入的executablePath会覆盖默认值,指向@sparticuz/chromium解压出来的二进制。headless: true确保浏览器以无头模式运行——Lambda 中没有显示器,这一点是必须的。

此外,launchContext中的headless也可以通过 Crawlee 的配置项控制(CRAWLEE_HEADLESS,默认true,见 configuration.ts),二者取其一即可。

3. 导出 Lambda handler 函数

最后,把爬虫逻辑包装进导出的handler函数——这就是 AWS Lambda 将要执行的入口。爬虫运行完成后,通过crawler.getData()从内存 Dataset 中取回结果并作为 HTTP 响应返回:

import { Configuration, PlaywrightCrawler } from 'crawlee'; import { router } from './routes.js'; import aws_chromium from '@sparticuz/chromium'; const startUrls = ['https://crawlee.dev']; export const handler = async (event, context) => { const crawler = new PlaywrightCrawler({ requestHandler: router, launchContext: { launchOptions: { executablePath: await aws_chromium.executablePath(), args: aws_chromium.args, headless: true } } }, new Configuration({ persistStorage: false, })); await crawler.run(startUrls); return { statusCode: 200, body: await crawler.getData(), }; }

getData()是 CrawleeDataset的读取方法(定义见 dataset.ts),返回数据集内容与元信息(如itemstotaloffsetcount),可以直接序列化进响应体。

部署代码到 Lambda

代码改造完成后,打包部署就很简单了——把代码打成 zip(注意排除node_modules,因为依赖已经放进了 Lambda Layer):

# 只打包代码,不打包 node_modules zip -r code.zip src package.json

然后在 AWS 控制台(或 CLI)中:

  1. 上传code.zip作为Lambda 函数代码
  2. 将前面创建好的crawlee-dependenciesLayer 挂载到该函数;
  3. 设置函数入口为main.handler(对应src/main.js中导出的handler);
  4. 测试运行,观察日志与返回结果。

内存与超时设置(重要提醒)

由于在 Lambda 上运行的是完整版浏览器,默认的 Lambda 配置不足以支撑其运行,务必调整两处:

  • 内存(Memory)设置为 1024 MB 或更高。Chromium 渲染页面、执行 JavaScript 都需要可观的内存,设置过低会导致 Lambda 进程被强制终止;
  • 更新 Lambda 超时(Timeout)。目标超时值取决于你的爬虫需要运行多久——建议先在本地运行同样的爬虫并测量执行时间,再据此设定超时值,留出一定余量以覆盖冷启动时间。

这两项配置既可以在 AWS 控制台的函数配置中修改,也可以通过aws lambda update-function-configuration命令行设置。

小结与部署检查清单

把 Crawlee 的PlaywrightCrawler部署到 AWS Lambda 的完整流程可归纳为:

  1. 依赖层npm i -S @sparticuz/chromium,将node_modules打包为dependencies.zip
  2. Layer 上传:因直接上传有约 50MB 限制,先传 S3,再通过 S3 对象创建 Lambda Layer 并挂载到函数;
  3. 代码改造:给爬虫传入独立Configuration({ persistStorage: false });用aws_chromium.executablePath()aws_chromium.args配置launchContext.launchOptions;导出handler并用crawler.getData()返回结果;
  4. 部署:代码(不含node_modules)打包上传,挂载 Layer,设置入口main.handler
  5. 资源配置:内存 ≥ 1024 MB,超时按本地实测执行时间设置。

遵循以上步骤,你就能在 AWS Lambda 上稳定运行基于 Playwright 的 Crawlee 浏览器爬虫,让无服务器架构承载完整的浏览器渲染与数据抓取任务。

【免费下载链接】crawleeCrawlee—A web scraping and browser automation library for Node.js to build reliable crawlers. In JavaScript and TypeScript. Extract data for AI, LLMs, RAG, or GPTs. Download HTML, PDF, JPG, PNG, and other files from websites. Works with Puppeteer, Playwright, Cheerio, JSDOM, and raw HTTP. Both headful and headless mode. With proxy rotation.项目地址: https://gitcode.com/GitHub_Trending/cr/crawlee

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询