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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:24:03