Puppeteer 脚本在本地工作,但不在 EC2 AWS 上

Posted

技术标签:

【中文标题】Puppeteer 脚本在本地工作,但不在 EC2 AWS 上【英文标题】:Puppeteer Script Works Local But Not On EC2 AWS 【发布时间】:2019-10-04 23:20:30 【问题描述】:

我正在使用 Amazon Linux AMI 在 EC2 AWS 上运行以下脚本

const puppeteer = require('puppeteer');

url_ =  'https://www.barchart.com/futures/quotes/ES*0/interactive-chart/fullscreen';

func()

async function func() 
    console.log(0)
    const browser = await puppeteer.launch();
    console.log(1)
    const page = await browser.newPage();
    console.log(2)
    await page.goto(url_);
    console.log(page)

    return page

从今天开始,在 EC2 上没有任何更改或新安装,脚本停止工作,而它一直工作到昨天。

本地机器上的相同脚本仍然有效。

相反,在 EC2 上会出现以下错误:

(节点:12636)UnhandledPromiseRejectionWarning:错误:导航失败,因为浏览器已断开连接! 在 CDPSession.LifecycleWatcher._eventListeners.helper.addEventListener (/home/ec2-user/hd/node_modules/puppeteer/lib/LifecycleWatcher.js:47:107) 在 CDPSession.emit (events.js:189:13) 在 CDPSession._onClosed (/home/ec2-user/hd/node_modules/puppeteer/lib/Connection.js:215:10) 在 Connection._onClose (/home/ec2-user/hd/node_modules/puppeteer/lib/Connection.js:138:15) 在 WebSocketTransport._ws.addEventListener.event (/home/ec2-user/hd/node_modules/puppeteer/lib/WebSocketTransport.js:45:22) 在 WebSocket.onClose (/home/ec2-user/hd/node_modules/ws/lib/event-target.js:124:16) 在 WebSocket.emit (events.js:189:13) 在 WebSocket.emitClose (/home/ec2-user/hd/node_modules/ws/lib/websocket.js:191:10) 在 Socket.socketOnClose (/home/ec2-user/hd/node_modules/ws/lib/websocket.js:850:15) 在 Socket.emit (events.js:189:13) -- 异步 -- 在框架。 (/home/ec2-user/hd/node_modules/puppeteer/lib/helper.js:110:27) 在 Page.goto (/home/ec2-user/hd/node_modules/puppeteer/lib/Page.js:656:49) 在页面。 (/home/ec2-user/hd/node_modules/puppeteer/lib/helper.js:111:23) 在 func (/home/ec2-user/hd/scrape_bk.js:19:13) 在 process._tickCallback (internal/process/next_tick.js:68:7) (节点:12636)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。 (拒绝编号:1) (节点:12636)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。

如果我改为提供此 URL (http://www.google.com),我会在 EC2 上收到此错误(但它仍可在本地计算机上运行):

(节点:12938)UnhandledPromiseRejectionWarning:错误:页面崩溃! 在 Page._onTargetCrashed (/home/ec2-user/hd/node_modules/puppeteer/lib/Page.js:185:24) 在 CDPSession.Page.client.on.event (/home/ec2-user/hd/node_modules/puppeteer/lib/Page.js:140:56) 在 CDPSession.emit (events.js:189:13) 在 CDPSession._onMessage (/home/ec2-user/hd/node_modules/puppeteer/lib/Connection.js:200:12) 在 Connection._onMessage (/home/ec2-user/hd/node_modules/puppeteer/lib/Connection.js:112:17) 在 WebSocketTransport._ws.addEventListener.event (/home/ec2-user/hd/node_modules/puppeteer/lib/WebSocketTransport.js:41:24) 在 WebSocket.onMessage (/home/ec2-user/hd/node_modules/ws/lib/event-target.js:120:16) 在 WebSocket.emit (events.js:189:13) 在 Receiver.receiverOnMessage (/home/ec2-user/hd/node_modules/ws/lib/websocket.js:789:20) 在 Receiver.emit (events.js:189:13) (节点:12938)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。 (拒绝编号:1) (节点:12938)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。 (节点:12938)UnhandledPromiseRejectionWarning:错误:导航失败,因为浏览器已断开连接! 在 CDPSession.LifecycleWatcher._eventListeners.helper.addEventListener (/home/ec2-user/hd/node_modules/puppeteer/lib/LifecycleWatcher.js:47:107) 在 CDPSession.emit (events.js:189:13) 在 CDPSession._onClosed (/home/ec2-user/hd/node_modules/puppeteer/lib/Connection.js:215:10) 在 Connection._onClose (/home/ec2-user/hd/node_modules/puppeteer/lib/Connection.js:138:15) 在 WebSocketTransport._ws.addEventListener.event (/home/ec2-user/hd/node_modules/puppeteer/lib/WebSocketTransport.js:45:22) 在 WebSocket.onClose (/home/ec2-user/hd/node_modules/ws/lib/event-target.js:124:16) 在 WebSocket.emit (events.js:189:13) 在 WebSocket.emitClose (/home/ec2-user/hd/node_modules/ws/lib/websocket.js:191:10) 在 Socket.socketOnClose (/home/ec2-user/hd/node_modules/ws/lib/websocket.js:850:15) 在 Socket.emit (events.js:189:13) -- 异步 -- 在框架。 (/home/ec2-user/hd/node_modules/puppeteer/lib/helper.js:110:27) 在 Page.goto (/home/ec2-user/hd/node_modules/puppeteer/lib/Page.js:656:49) 在页面。 (/home/ec2-user/hd/node_modules/puppeteer/lib/helper.js:111:23) 在 func (/home/ec2-user/hd/scrape_bk.js:13:13) 在 process._tickCallback (internal/process/next_tick.js:68:7) (节点:12938)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。 (拒绝编号:2)

我不知道如何确定问题的根源,因为它突然出现而没有对机器或代码进行任何更改,并且在我的本地机器上它工作正常。

【问题讨论】:

你检查过Troubleshooting guide吗?机器是否可能由于内存/CPU而受到限制? 错误是否可能是由于磁盘空间不足造成的?我只剩下 100MB 是的,很有可能。我很确定内存/CPU/磁盘/网络问题会导致浏览器崩溃。 我想这就是解决方案,是有道理的 很高兴我能帮上忙。我希望没关系,我将其添加为答案:) 【参考方案1】:

似乎 puppeteer 能够启动浏览器,但随后随机崩溃。这不应该在普通机器上发生,并且可能由于资源限制而发生。

您应该检查您的系统是否正常运行。特别是,您可能需要检查:

内存使用情况 CPU 使用率 磁盘使用情况

内存太少或 CPU 能力不足可能会导致随机崩溃以及硬盘空间不足。

【讨论】:

以上是关于Puppeteer 脚本在本地工作,但不在 EC2 AWS 上的主要内容,如果未能解决你的问题,请参考以下文章

Puppeteer:如何在 ec2 服务器上安装 puppeteer

我在 ec2 安全组上添加了端口 8080,但 8080 不在监听列表中

如何在chrome headless + puppeteer评估()中使用xpath?

Puppeteer:如何存储会话(包括 cookie、页面状态、本地存储等)并稍后继续?

PhpMyadmin 不在 AWS EC2 实例上工作

Laravel 视图在生产中工作但不在本地