使用Puppeteer+AWS Lambda爬取数据时Chrome启动失败(Node.js 12.x)
解决Node.js 12.x + Puppeteer + AWS Lambda启动Chrome失败的问题
我之前在AWS Lambda上用Puppeteer做数据爬取时,也碰到过完全一样的ENOENT错误——核心原因是Lambda的精简Linux环境和Puppeteer默认的Chrome二进制文件不兼容,要么是路径找不到,要么是缺少运行依赖。下面是经过验证的解决方案:
最推荐的方案:使用chrome-aws-lambda包
这个包是专门为Lambda环境优化的,已经内置了兼容Lambda的Chrome二进制文件和必要的系统依赖,完美解决路径和依赖问题。
步骤1:安装依赖
npm install chrome-aws-lambda puppeteer-core
这里用puppeteer-core而不是完整的puppeteer,因为chrome-aws-lambda已经提供了Chrome,不需要重复下载冗余文件。
步骤2:调整Lambda代码
修改你的爬取代码,用chrome-aws-lambda提供的预设配置启动浏览器:
const chromium = require('chrome-aws-lambda'); const puppeteer = require('puppeteer-core'); exports.handler = async (event) => { let browser = null; try { // 用chrome-aws-lambda的预设配置启动Chrome,适配Lambda环境 browser = await puppeteer.launch({ args: chromium.args, // 自动包含--no-sandbox等Lambda必需参数 defaultViewport: chromium.defaultViewport, executablePath: await chromium.executablePath, // 自动获取正确的Chrome路径 headless: chromium.headless, ignoreHTTPSErrors: true, }); // 你的爬取逻辑示例 const page = await browser.newPage(); await page.goto('目标网址'); const data = await page.evaluate(() => { // 这里写页面数据提取逻辑,比如获取标题 return document.title; }); return { statusCode: 200, body: JSON.stringify({ result: data }), }; } catch (error) { console.error('爬取失败:', error); return { statusCode: 500, body: JSON.stringify({ message: '爬取失败', error: error.message }), }; } finally { // 确保浏览器关闭,避免资源泄漏 if (browser) await browser.close(); } };
如果坚持用原生Puppeteer(不推荐)
如果一定要用官方Puppeteer,需要手动处理两个核心问题:
1. 确保Chrome二进制文件被正确打包
Lambda部署包中必须包含Puppeteer下载的Chrome,打包时不要忽略node_modules/puppeteer/.local-chromium目录,否则Lambda会找不到可执行文件。
2. 添加Lambda缺失的系统依赖
Lambda的Amazon Linux环境缺少Chrome运行所需的库(比如libatk1.0-0、libcairo2、libx11-xcb1等),你需要创建一个Lambda层,把这些依赖打包进去,然后附加到你的Lambda函数上。
3. 调整启动参数
在puppeteer.launch()中指定正确的路径并强制禁用沙箱(Lambda环境不支持Chrome沙箱):
await puppeteer.launch({ executablePath: './node_modules/puppeteer/.local-chromium/linux-722234/chrome-linux/chrome', args: ['--no-sandbox', '--disable-setuid-sandbox'], headless: true, });
额外注意事项
- Node.js 12.x已经停止维护,建议尽量升级到更高版本(比如16.x或18.x),但如果必须用12.x,要确保Puppeteer版本在v10.x左右(更高版本不再支持Node.js 12)。
- 打包时不要用
npm install --production排除chrome-aws-lambda,它的二进制文件是运行必需的。
内容的提问来源于stack exchange,提问作者Sophia Wauge




