Puppeteer本地运行正常但部署到Heroku、AWS EC2后无法爬取数据是什么原因?
问题排查与解决方案
1. 缺少无头模式配置(最高概率)
你当前的启动配置未开启无头模式,本地运行时可正常弹出可视化浏览器执行,但无图形界面的服务器环境下浏览器会直接启动失败,这是最常见的部署失效原因。
在puppeteer.launch的配置中新增无头模式参数即可:
async function startBrowser() { const browser = await puppeteer.launch({ // puppeteer v19+ 推荐使用新版无头模式,旧版本替换为 headless: true headless: 'new', args: [ '--no-sandbox', '--disable-gpu', '--disable-dev-shm-usage', '--disable-setuid-sandbox', '--no-first-run', '--no-zygote' // 移除容易导致进程崩溃的--single-process参数 ], }); const page = await browser.newPage(); return { browser, page }; }
2. 页面加载等待逻辑缺失
服务器网络延迟通常高于本地,你调用goto方法时没有配置等待条件和超时时间,大概率是页面还没完成渲染就已经执行了内容提取逻辑,自然返回空值。修改goto调用代码:
// 等待网络空闲2秒,超时时间设为30秒,可根据实际需求调整 const request = await tab.goto('你的目标URL', { waitUntil: 'networkidle2', timeout: 30000 }); await page.goto('你的另一目标URL', { waitUntil: 'networkidle2', timeout: 30000 });
3. 系统缺少Chromium运行依赖
服务器环境默认没有安装Chromium运行需要的系统依赖库:
- Heroku平台需要在应用设置页配置puppeteer对应构建包,才能正常安装Chromium依赖
- AWS EC2(Debian/Ubuntu系统为例)需要先执行依赖安装命令:
apt update && apt install -y libnss3 libxss1 libasound2 libatk-bridge2.0-0 libgtk-3-0 libgbm-dev
4. 服务器IP被目标网站拦截
本地IP未被目标站点封禁,但云服务器的公网IP大概率已经被目标站的反爬机制识别拦截。你可以打印text变量的内容,查看返回的是否是反爬拦截页、403错误页而非正常内容。如果是拦截场景,需要额外配置代理IP、修改请求UA等反爬逻辑。
快速定位技巧
你可以把服务器运行时生成的截图下载到本地查看,就能直接判断是浏览器未启动、页面未加载完成还是被反爬拦截,比盲目修改配置效率高很多。
内容的提问来源于stack exchange,提问作者user17399782
相关产品推荐
相关产品推荐

