You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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-0libcairo2libx11-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

火山引擎 最新活动