Puppeteer在Ubuntu EC2服务器启动失败,browser未定义原因排查
Puppeteer在EC2 Ubuntu报错“browser未定义”的原因及解决方法
可能的原因及对应解决方法
1. Node.js版本不支持顶层await
你的代码直接在顶层使用了await,这一特性仅在Node.js 14.8.0及以上版本支持。如果EC2服务器上的Node.js版本低于该阈值,await puppeteer.launch()会执行失败,导致browser变量未被正确赋值。而本地环境可能使用了更高版本的Node.js,因此没有问题。
解决方法:
- 升级EC2上的Node.js到14.8.0或更高版本;
- 或者将代码包裹在异步自执行函数中,兼容低版本Node.js:
const puppeteer = require('puppeteer'); (async () => { try { const browser = await puppeteer.launch({headless: true}); const page = await browser.newPage(); // 这里添加你的爬取逻辑 await browser.close(); } catch (err) { console.error(err); } })();
2. EC2 Ubuntu缺少Puppeteer依赖的系统库
Puppeteer依赖一系列系统底层库来启动Chromium浏览器,EC2默认的Ubuntu环境可能未安装这些依赖,导致puppeteer.launch()启动失败,browser变量无法初始化。
解决方法:
在EC2服务器上执行以下命令安装必要依赖:
sudo apt-get update sudo apt-get install -y libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxrandr2 libgbm1 libasound2 libpangocairo-1.0-0 libgtk-3-0
3. 进程启动权限不足
运行代码的用户没有足够权限启动Chromium进程,导致puppeteer.launch()调用失败,browser变量未定义。
解决方法:
- 确保运行代码的用户拥有足够的系统权限;
- 或者在启动时添加
--no-sandbox和--disable-setuid-sandbox参数(注意:该参数会关闭浏览器沙箱,仅建议在可信的服务器环境中使用):
const browser = await puppeteer.launch({ headless: true, args: ['--no-sandbox', '--disable-setuid-sandbox'] });
内容的提问来源于stack exchange,提问作者Michy
相关产品推荐
相关产品推荐

