Node.js + puppeteer + chrome 环境部署至linux

踩坑整整5天才和运维大哥部署成功......

先说下具体的思路,因为puppeteer的运行必须依赖于浏览器,这里使用的是chrome,

此处安装浏览器的方法有两种, 是因为puppeteer提供了两种连接调试浏览器的方案 连接已有的浏览器如下所示:

javascript 复制代码
      console.log("🔗 连接到本地Chrome浏览器...");
      const browserURL = 'http://localhost:9222'; //   浏览器服务启动之后可以直接访问
      
     /*   
     
     
     避坑:这里会有个问题,就是页面会一直保存在 对应端口的浏览器页面在浏览器的本地存储,也就是说,如果你的脚本执行的任务有登录的逻辑,那么下次脚本运行之后,会直接访问到第一次登录的用户信息,类似于用户自己操作登录后,后续进入也不用登录是一个逻辑。
     
     这里是本地连接和使用自带的chrome的一个很大的区别,
   请务必在js逻辑中做兼容处理,
   
   否则你会发现,该模式和自带的模式出现不一样的结果,而不知道问题所在。
     
     
        */
      
      browser = await puppeteer.connect({
        browserURL: browserURL,
        defaultViewport: null
      });
      
      
    
      
      
      
      
      
      
      const version = await browser.version();
      console.log(version);

使用puppeteer自带的如下所示:

javascript 复制代码
// 启动新的浏览器实例(默认模式)
      // 使用puppeteer自带的Chromium,避免系统浏览器依赖
      const browserConfig = {
        headless: false, // 使用配置中的无头模式
        // 不指定executablePath,让puppeteer使用自带的浏览器
        args: [  // 相关配置参数
          ...config.browser.args,
          `--window-size=${config.browser.windowSize.width},${config.browser.windowSize.height}`,
          "--no-sandbox",
          "--disable-setuid-sandbox",
          "--disable-dev-shm-usage",
        ],
        ignoreHTTPSErrors: true,
        defaultViewport: null,
        timeout: 6 * 1000,
      };

      console.log(getTimestampedLog("📱 启动浏览器..."));
      browser = await puppeteer.launch(browserConfig);
      const version = await browser.version();
      console.log(version);

第一种就是: 直接使用,puppeteer自己的浏览器,缺点是: 安装慢,部署很容易失败

第二就是:会有什么权限问题导致无法启动 例如这样:(自动化操作失败:Failed to launch the browser process: spawn /root/.cache/puppeteer/chrome/1inux-142.0.7444.61/chrome-1inux64/chrome ENOE)

综上所述:

本文采用第二条路就是,单独安装运行chrome服务, 然后,用puppeteer链接本地的chrome服务。

1, 安装chrome 并运行服务至9222端口

注意:本人的服务器是cent os7(下面两种方案都可以用, 方案二是因为运维的服务器, 系统不支持方案一, 因此提供docker 的方案)

chrome 安装

方案一:

1, liunx 先安装一下谷歌浏览器
bash 复制代码
sudo yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm -y
2. 启动浏览器 无头模式 开放本地 9222 端口
bash 复制代码
google-chrome-stable --no-sandbox --headless --disable-gpu --remote-debugging-port=9222

方案二:(提前安装 docker )

拉取镜像
bash 复制代码
docker pull selenium/standalone-chrome
运行镜像
bash 复制代码
docker run -d \
  -p 9222:9222 \
  -v /dev/shm:/dev/shm \
  --name chrome-debug \
  --entrypoint google-chrome \
  selenium/standalone-chrome \
  --remote-debugging-address=0.0.0.0 \
  --remote-debugging-port=9222 \
  --no-sandbox \
  --headless
检测是否运行成功
bash 复制代码
curl http://localhost:9222/json/version

运行成功会输出如下的信息:

bash 复制代码
{
   "Browser": "Chrome/142.0.7444.162",
   "Protocol-Version": "1.3",
   "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/142.0.0.0 Safari/537.36",
   "V8-Version": "14.2.231.18",
   "WebKit-Version": "537.36 (@c076baf266c3ed5efb225de664cfa7b183668ad6)",
   "webSocketDebuggerUrl": "ws://localhost:9222/devtools/browser/5f3804d2-146a-475c-a43a-c5e211387413"
}

有如上的信息,恭喜你,已经安装成功了!!!

2,部署一下 puppeteer 的node服务。 这里就看看什么版本的 puppeteer 了。 本人用的新版本的 "puppeteer": "^24.29.1" node > 18 即可。

bash 复制代码
npm install //安装
node xxx.js // 运行

如果失败了,配置镜像什么的就好了。(不必过多赘述,前端估计都遇到过)

如继续失败,还可以使用cnpm

bash 复制代码
npm i -g cnpm

cnpm install

即可,cnpm几乎不会失败。

bash 复制代码
node xxx.js // 就可以运行了。
相关推荐
张拭心17 小时前
Cursor 又偷偷更新,这个功能太实用:Visual Editor for Cursor Browser
前端·人工智能
I'm Jie18 小时前
深入了解 Vue 3 组件间通信机制
前端·javascript·vue.js
用户904438163246019 小时前
90%前端都踩过的JS内存黑洞:从《你不知道的JavaScript》解锁底层逻辑与避坑指南
前端·javascript·面试
CodeCraft Studio19 小时前
文档开发组件Aspose 25.12全新发布:多模块更新,继续强化文档、图像与演示处理能力
前端·.net·ppt·aspose·文档转换·word文档开发·文档开发api
PPPPickup20 小时前
easychat项目复盘---获取联系人列表,联系人详细,删除拉黑联系人
java·前端·javascript
老前端的功夫20 小时前
前端高可靠架构:医疗级Web应用的实时通信设计与实践
前端·javascript·vue.js·ubuntu·架构·前端框架
前端大卫20 小时前
【重磅福利】学生认证可免费领取 Gemini 3 Pro 一年
前端·人工智能
孜燃20 小时前
Flutter APP跳转Flutter APP 携带参数
前端·flutter
脾气有点小暴21 小时前
前端页面跳转的核心区别与实战指南
开发语言·前端·javascript
lxh011321 小时前
最长递增子序列
前端·数据结构·算法