
在 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),僅供參考