在 GCP Cloud Run 上部署带浏览器的 Crawlee 爬虫:Playwright/Chromium 全指南

发布时间:2026/9/12 23:28:36
在 GCP Cloud Run 上部署带浏览器的 Crawlee 爬虫:Playwright/Chromium 全指南 在 GCP Cloud Run 上部署带浏览器的 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本文是一份面向 Node.js 开发者的实战部署指南讲解如何将使用 Playwright、Puppeteer 等浏览器驱动的 Crawlee 爬虫部署到 Google Cloud PlatformGCP的 Cloud Run 服务上。你会掌握为什么 Cloud Functions 无法直接运行 Chromium、如何用Configuration关闭本地持久化、如何用 Express 把爬虫包装成 HTTP 服务以及通过gcloud run deploy一键上云并处理首次运行失败的调优方法。为什么是 Cloud Run而不是 Cloud Functions在 GCP 上运行完整版浏览器爬虫与在 AWS Lambda 上运行有显著差异Cloud Functions 的最新运行时缺少运行 Chromium 所必需的依赖这是 Puppeteer 官方排查文档中记录的已知问题。因此要让浏览器版的 Crawlee 爬虫在 GCP 上运行需要转向Cloud Run——GCP 面向 Docker 容器的托管平台。除此之外它的使用方式与 Cloud Functions / AWS Lambda 几乎完全一致。Cloud Run 的核心特性对应本仓库中的 docs/deployment/gcp-browsers.md 说明按需拉起容器GCP 会在收到请求时才启动你的容器你只为容器从收到请求到返回 HTTP 响应之间的运行时间付费冷启动不产生费用本地可调试相比传统 FaaSCloud Run 提供了更好的开发体验——你可以先在本地把 Docker 容器跑起来调试确保与云端拿到完全一致的运行环境再部署上去。这一模型意味着你的爬虫代码必须被打包进 Docker 镜像并且对外暴露一个 HTTP 服务入口。准备项目关闭持久化存储无论部署到哪个 FaaS/容器平台第一步都是在创建爬虫时传入一个新的Configuration实例并关闭存储持久化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是Configuration的内置配置字段之一定义于 packages/core/src/configuration.ts/** default true */ persistStorage: field(coerceBoolean.default(true), CRAWLEE_PERSIST_STORAGE), /** default ./storage */ storageDir: field(z.string().default(./storage), CRAWLEE_STORAGE_DIR),这意味着persistStorage默认值为true在无状态容器环境中必须显式关闭否则 Crawlee 会尝试把 RequestQueue、Dataset、KeyValueStore 等状态写入本地./storage目录storageDir的默认值而容器实例随时可能被回收该字段同样支持通过环境变量CRAWLEE_PERSIST_STORAGE覆盖适合在 Dockerfile 或 Cloud Run 环境配置中统一管理根据 packages/core/src/configuration.ts 中声明的解析优先级构造函数参数 环境变量 crawlee.json schema 默认值。因此直接传入new Configuration({ persistStorage: false })是最高优先级的做法不会被环境变量意外覆盖。关闭持久化后爬取的数据仍会存放在内存中的 Dataset 里可以在爬取结束后通过crawler.getData()一次性取出对应 packages/core/src/storages/dataset.ts 的Dataset.getData()返回DatasetContent对象内含items数组及total、offset、count、limit等分页信息。用 Express 包装 HTTP 处理器Cloud Run 平台看到的只是一个不透明的 Docker 容器它不关心你的应用内部是什么框架只要求容器内的 HTTP 服务在指定端口上监听。因此我们需要自己动手把爬虫包装进一个 Express HTTP 服务器。PORT 环境变量GCP 会向容器注入一个名为PORT的环境变量你的 HTTP 服务器必须监听这个端口GCP 才会把该端口暴露给外部世界。代码里要读取并解析它app.listen(parseInt(process.env.PORT) || 3000);parseInt(process.env.PORT) || 3000的写法兼顾了云端使用 GCP 注入的PORT与本地开发未设置时回退到 3000两种场景。最终完整的 main.js将爬虫逻辑放进 Express 的 GET 路由处理器中完整脚本如下import { Configuration, PlaywrightCrawler } from crawlee; import { router } from ./routes.js; import express from express; const app express(); const startUrls [https://crawlee.dev]; app.get(/, async (req, res) { const crawler new PlaywrightCrawler({ requestHandler: router, }, new Configuration({ persistStorage: false, })); await crawler.run(startUrls); return res.send(await crawler.getData()); }); app.listen(parseInt(process.env.PORT) || 3000);无状态是硬性要求和所有 FaaS 平台一样Cloud Run 的请求处理器必须保持无状态stateless每次请求到达时在处理器内部创建爬虫实例用完即弃不要在请求之间共享爬虫、浏览器实例或内存中的数据集状态——容器实例可能随时被水平伸缩、重建或回收数据要么在单次请求内通过crawler.getData()返回给客户端要么发送到外部存储如数据库、对象存储绝不能依赖本地文件系统保存跨请求状态。部署到 GCP准备 Dockerfile如果项目是通过npx crawlee create初始化的初始化脚本已经为你准备好了现成的Dockerfile。以仓库中的 Playwright TypeScript 模板packages/templates/templates/playwright-ts/Dockerfile为例它采用了两阶段构建# 第一阶段构建 FROM apify/actor-node-playwright-chrome:24-1.58.2 AS builder COPY --chownmyuser package*.json ./ RUN npm install --includedev --auditfalse COPY --chownmyuser . ./ RUN npm run build # 第二阶段精简运行镜像 FROM apify/actor-node-playwright-chrome:24-1.58.2 COPY --frombuilder --chownmyuser /home/myuser/dist ./dist COPY --chownmyuser package*.json ./ RUN npm --quiet set progressfalse \ npm install --omitdev \ echo Installed NPM packages: \ (npm list --omitdev --all || true) \ echo Node.js version: \ node --version \ echo NPM version: \ npm --version COPY --chownmyuser . ./ CMD ./start_xvfb_and_run_cmd.sh npm run start:prod --silent这个 Dockerfile 的几个关键点基础镜像apify/actor-node-playwright-chrome已预装 Chromium 及 Playwright 运行所需系统依赖这正是 Cloud Functions 缺失而容器方案能解决的更多可用镜像见 docs/guides/docker_images.mdx先拷贝package.json再执行依赖安装充分利用 Docker 层缓存加速后续构建生产阶段使用--omitdev跳过开发依赖控制镜像体积CMD中通过start_xvfb_and_run_cmd.sh启动 XVFB 虚拟显示保证 headful 模式下浏览器也能在无显示器容器中运行package.json中的start:prod对应node dist/main.js若你的项目由仓库中的其他模板如 puppeteer-ts、cheerio-ts见 packages/templates/templates/初始化同样会生成对应的 Dockerfile思路一致。执行 gcloud run deploy在包含 Dockerfile 的项目目录下执行gcloud run deploygcloudCLI 会引导你回答几个问题主要包括部署区域region选择离目标网站或用户较近的区域是否允许未认证访问public/private即应用是否对外公开还是仅限项目内调用。回答完毕后应用会出现在 GCP 控制台的 Cloud Run 面板中并分配一个访问链接通过该链接即可触发爬虫运行。首次运行失败的调优如果新创建的 Cloud Run 服务第一次执行就失败通常需要编辑 Run 的配置内存建议设置为1GiB 或更高。Chromium 实例本身的内存占用较大加上 Node.js 运行时与爬虫数据结构默认配额很容易触顶请求超时根据你抓取的目标网站规模调整请求超时时间。大页面、慢站点、多级爬取链路都会显著拉长单次请求耗时超时过短会导致容器被提前终止。关联阅读想要无浏览器、纯 HTTP 的轻量方案部署到 GCP可参考 docs/deployment/gcp-cheerio.md同样的思路部署到 AWS Lambda 的浏览器版本见 docs/deployment/aws-browsers.md 与 docs/deployment/aws-cheerio.mdApify 平台Crawlee 的原生托管环境部署方式见 docs/deployment/apify_platform.mdxDocker 镜像选型与自定义见 docs/guides/docker_images.mdx本指南的版本化文档位于 website/versioned_docs/version-3.16/deployment/gcp-browsers.md仓库的现行版本见 docs/deployment/gcp-browsers.md。【免费下载链接】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),仅供参考