Puppeteer-core本地运行正常,部署至Vercel后浏览器启动失败
Next.js App Router + Puppeteer 部署Vercel失败解决方案
问题根源
本地正常但Vercel部署失败,核心原因是Vercel Serverless环境没有预装Chrome浏览器,而你使用的puppeteer-core本身不包含浏览器二进制文件,导致启动失败。
具体修复步骤
- 替换依赖包
卸载puppeteer-core,安装完整的puppeteer包(自带适配Serverless环境的Chrome二进制文件):
npm uninstall puppeteer-core npm install puppeteer
同时修改代码导入:
// 删掉原有的executablePath导入,改成直接导入puppeteer import puppeteer from "puppeteer";
- 调整浏览器启动配置
Vercel的Serverless环境有内存和权限限制,需要修改launch参数,同时不用手动指定executablePath(puppeteer会自动处理):
browser = await puppeteer.launch({ headless: "new", // 启用新版无头模式,兼容性更好 args: [ "--no-sandbox", "--disable-setuid-sandbox", "--disable-blink-features=AutomationControlled", "--disable-dev-shm-usage", // 解决Vercel临时内存不足问题 "--single-process", // 适配Serverless单进程环境 ], });
- 添加Vercel配置文件
在项目根目录创建vercel.json,确保构建时保留浏览器缓存文件:
{ "functions": { "app/**/*.{js,ts,jsx,tsx}": { "includeFiles": ".next/cache/**/*" } } }
- 强化反爬规避
Instagram对无头浏览器检测严格,在page.goto前添加以下代码:
// 设置真实用户代理 await page.setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"); // 禁用自动化检测标识 await page.evaluateOnNewDocument(() => { Object.defineProperty(navigator, 'webdriver', { get: () => false, }); });
- 优化错误提示
原代码把所有错误都归为“用户不存在”,建议区分错误类型:
catch (error) { if (error instanceof Error) { if (error.message.includes("Failed to launch")) { throw new Error("浏览器启动失败:" + error.message); } else if (error.message.includes("$eval: failed to find element")) { throw new Error("用户不存在或页面结构已变更"); } else { throw new Error("爬取失败:" + error.message); } } else { throw new Error("未知错误"); } }
内容的提问来源于stack exchange,提问作者ankit
相关产品推荐
相关产品推荐

