You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在AWS Lambda中用Playwright和@sparticuz/chromium遇net::ERR_INSUFFICIENT_RESOURCES错误

解决AWS Lambda中Playwright+@sparticuz/chromium的net::ERR_INSUFFICIENT_RESOURCES错误

1. 修复浏览器实例复用导致的资源泄漏

Lambda执行环境存在复用特性,若跨请求复用浏览器实例,之前请求耗尽资源的异常实例会被保留,后续请求复用后持续报错。

  • 禁止跨请求复用浏览器:每次API请求都重新启动全新的浏览器实例,而非复用旧实例。
  • 强制清理残留进程:在Lambda函数结束时,除了关闭上下文和浏览器,额外杀死Chromium相关进程,避免资源残留:
    import { execSync } from 'child_process';
    // 关闭浏览器后执行
    execSync('pkill -f chromium');
    

2. 优化Chromium启动参数

针对Lambda环境添加资源精简参数,减少内存与进程开销:

const browser = await chromium.launch({
  args: [
    '--disable-gpu',
    '--disable-dev-shm-usage',
    '--no-sandbox',
    '--single-process',
    '--disable-zygote',
    '--disable-extensions',
    '--disable-background-networking',
    '--disable-renderer-throttling',
    '--disable-notifications',
    '--no-first-run',
    '--password-store=basic'
  ],
  headless: true,
});

3. 调整重试策略与资源释放逻辑

现有重试逻辑复用旧浏览器创建上下文,若浏览器已资源不足,新上下文仍会报错:

  • 重试时重启浏览器:每次重试都关闭当前浏览器,重新启动新实例,而非复用旧实例。
  • 实时释放资源:每次爬取(含重试)后立即关闭页面、上下文,不等到所有重试结束再统一清理:
    async function crawlPage(url) {
      let browser, context, page;
      try {
        browser = await chromium.launch({ /* 启动参数 */ });
        context = await browser.newContext();
        page = await context.newPage();
        await page.goto(url, { timeout: 30000, waitUntil: 'domcontentloaded' });
        // 爬取逻辑
        return result;
      } catch (error) {
        throw error;
      } finally {
        if (page) await page.close();
        if (context) await context.close();
        if (browser) await browser.close();
        execSync('pkill -f chromium');
      }
    }
    
    async function withRetry(url, retries = 2) {
      for (let i = 0; i < retries; i++) {
        try {
          return await crawlPage(url);
        } catch (error) {
          if (i === retries - 1) throw error;
        }
      }
    }
    

4. 清理Chromium缓存与调整Lambda配置

  • 清理临时缓存:Chromium会在/tmp目录写入缓存,每次启动前清理指定缓存目录:
    import fs from 'fs';
    import path from 'path';
    const cacheDir = path.join('/tmp', 'chromium-cache');
    if (fs.existsSync(cacheDir)) fs.rmSync(cacheDir, { recursive: true });
    // 启动参数添加缓存目录指定
    '--disk-cache-dir=' + cacheDir,
    
  • 延长执行超时:Lambda默认超时3秒,爬取网页需设置为5-10分钟,避免因超时导致资源未正常释放。

5. 减少目标网页资源加载

拦截非必要资源,降低页面加载的资源消耗:

await context.route('**/*.{png,jpg,jpeg,gif,svg,mp4,css}', route => route.abort());

内容的提问来源于stack exchange,提问作者user17991685

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 19:47:14