首页 > 编程问答 >Heroku 上的 Pyppeteer 浏览器意外关闭

Heroku 上的 Pyppeteer 浏览器意外关闭

时间:2024-07-25 09:43:29浏览次数:7  
标签:python chromium pyppeteer

我在 Heroku 上升级了我的堆栈,我注意到一条消息告诉我使用较新的 chrome buildpack,而不是我使用过的较旧的 buildpack。从逻辑上讲,我继续安装 这个构建包 按照说明。 selenium.webdriver 工作正常,但是 pyppeteer 根本不起作用,这是我遇到的错误:

2024-07-24T19:38:13.917255+00:00 app[worker.1]: [INFO] Starting Chromium download.
2024-07-24T19:38:17.444891+00:00 app[worker.1]:
2024-07-24T19:38:17.446137+00:00 app[worker.1]: [INFO] Beginning extraction
2024-07-24T19:38:20.286229+00:00 app[worker.1]: [INFO] Chromium extracted to: /app/.local/share/pyppeteer/local-chromium/588429        
2024-07-24T19:38:50.317178+00:00 app[worker.1]: [2024-07-24 19:38:50] [ERROR   ] discord.ext.tasks: Unhandled exception in internal background task '_amex_experiences'.
2024-07-24T19:38:50.317187+00:00 app[worker.1]: Traceback (most recent call last):
2024-07-24T19:38:50.317188+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.10/site-packages/discord/ext/tasks/__init__.py", 
line 239, in _loop
2024-07-24T19:38:50.317188+00:00 app[worker.1]: await self.coro(*args, **kwargs)
2024-07-24T19:38:50.317189+00:00 app[worker.1]: File "/app/cogs/tasks.py", line 205, in _amex_experiences
2024-07-24T19:38:50.317189+00:00 app[worker.1]: await amex_experiences.run_experiences(self.bot.pool, self.bot)
2024-07-24T19:38:50.317189+00:00 app[worker.1]: File "/app/amex_experiences.py", line 82, in run_experiences
2024-07-24T19:38:50.317190+00:00 app[worker.1]: browser = await launch({
2024-07-24T19:38:50.317190+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.10/site-packages/pyppeteer/launcher.py", line 307, in launch
2024-07-24T19:38:50.317190+00:00 app[worker.1]: return await Launcher(options, **kwargs).launch()
2024-07-24T19:38:50.317190+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.10/site-packages/pyppeteer/launcher.py", line 168, in launch
2024-07-24T19:38:50.317191+00:00 app[worker.1]: self.browserWSEndpoint = get_ws_endpoint(self.url)
2024-07-24T19:38:50.317191+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.10/site-packages/pyppeteer/launcher.py", line 227, in get_ws_endpoint
2024-07-24T19:38:50.317191+00:00 app[worker.1]: raise BrowserError('Browser closed unexpectedly:\n')
2024-07-24T19:38:50.317192+00:00 app[worker.1]: pyppeteer.errors.BrowserError: Browser closed unexpectedly:
2024-07-24T19:38:50.317192+00:00 app[worker.1]:
2024-07-24T19:38:50.317201+00:00 app[worker.1]: [2024-07-24 19:38:50] [ERROR   ] discord.ext.tasks: Unhandled exception in internal background task '_amex_experiences'.
2024-07-24T19:38:50.317201+00:00 app[worker.1]: Traceback (most recent call last):
2024-07-24T19:38:50.317201+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.10/site-packages/discord/ext/tasks/__init__.py", line 239, in _loop
2024-07-24T19:38:50.317201+00:00 app[worker.1]: await self.coro(*args, **kwargs)
2024-07-24T19:38:50.317202+00:00 app[worker.1]: File "/app/cogs/tasks.py", line 205, in _amex_experiences
2024-07-24T19:38:50.317202+00:00 app[worker.1]: await amex_experiences.run_experiences(self.bot.pool, self.bot)
2024-07-24T19:38:50.317202+00:00 app[worker.1]: File "/app/amex_experiences.py", line 82, in run_experiences
2024-07-24T19:38:50.317202+00:00 app[worker.1]: browser = await launch({
2024-07-24T19:38:50.317202+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.10/site-packages/pyppeteer/launcher.py", line 307, in launch
2024-07-24T19:38:50.317203+00:00 app[worker.1]: return await Launcher(options, **kwargs).launch()
2024-07-24T19:38:50.317203+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.10/site-packages/pyppeteer/launcher.py", line 168, in launch
2024-07-24T19:38:50.317203+00:00 app[worker.1]: self.browserWSEndpoint = get_ws_endpoint(self.url)
2024-07-24T19:38:50.317203+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.10/site-packages/pyppeteer/launcher.py", line 227, in get_ws_endpoint
2024-07-24T19:38:50.317203+00:00 app[worker.1]: raise BrowserError('Browser closed unexpectedly:\n')
2024-07-24T19:38:50.317203+00:00 app[worker.1]: pyppeteer.errors.BrowserError: Browser closed unexpectedly:

我已经尝试过StackOverflow 上提供的所有解决方案,例如安装 puppeteer buildpack,虽然不起作用,但我已将 --disable-setuid-sandbox 参数添加到 pyppeteer,也不起作用。

MRE:

from pyppeteer import launch
import asyncio
import os

exec_path = os.environ.get("GOOGLE_CHROME_SHIM", None)


async def main():
    await launch({
        "headless": True,
        "args": {
            "--no-sandbox", "--disable-setuid-sandbox"
        },
        "executablePath": exec_path
    })


asyncio.run(main())

该错误“pyppeteer.errors.BrowserError: Browser closed unexpectedly”在 Heroku 上通常表示 Chrome 浏览器因内存不足或其他资源限制而崩溃。Heroku dyno 对可用内存有严格限制,运行 Chrome 等无头浏览器可能非常耗资源。

以下是一些可以解决此问题的步骤:

1. 减少 Chrome 内存使用量:

  • 禁用扩展程序: 在启动 Chrome 时禁用扩展程序可以减少内存使用量。将 '--disable-extensions' 参数添加到你的 Pyppeteer 启动选项中。
  • 禁用 GPU: Chrome 渲染网页时使用 GPU 可能会增加内存使用量。使用 '--disable-gpu' 参数禁用 GPU。
  • 减少标签页数: 如果你的代码打开多个标签页,请尝试减少标签页数或依次处理它们,以限制内存使用量。

2. 优化你的代码:

  • 关闭不再需要的浏览器实例: 确保在你使用完浏览器后使用 browser.close() 关闭它。这将释放资源以供其他进程使用。
  • 使用异步操作: Pyppeteer 是异步的,使用 async/await 语法可以更高效地使用资源。确保你的代码没有阻塞操作会降低性能。

3. 增加 dyno 内存:

如果上述步骤都不起作用,你可能需要升级到具有更多内存的更高 Heroku dyno。这将使 Chrome 有更多空间运行而不会崩溃。但是,这是一个更昂贵的解决方案。

更新后的启动代码:

以下是使用建议参数更新的 Pyppeteer 启动代码:

from pyppeteer import launch
import asyncio
import os

exec_path = os.environ.get("GOOGLE_CHROME_SHIM", None)


async def main():
    browser = await launch({
        'headless': True,
        'args': [
            '--no-sandbox',
            '--disable-setuid-sandbox',
            '--disable-extensions',
            '--disable-gpu',
            '--disable-dev-shm-usage',  # 这可以帮助解决某些系统上的共享内存问题
        ],
        'executablePath': exec_path
    })

    # 在这里添加你的代码以使用浏览器

    await browser.close()


asyncio.run(main())

其他提示:

  • 监控 dyno 使用情况: 使用 heroku logs heroku ps 命令监控 dyno 的内存和 CPU 使用情况。这可以帮助你确定资源限制是否是问题所在。
  • 考虑使用其他解决方案: 如果你的抓取需求很简单,请考虑使用 Playwright 或 Selenium 等替代库,这些库可能比 Pyppeteer 更轻量级。

通过实现这些更改,你应该能够解决“Browser closed unexpectedly”错误并使你的 Pyppeteer 代码在 Heroku 上顺利运行。

标签:python,chromium,pyppeteer
From: 78790302

相关文章

  • 如何在 Mac 上运行 Python 文件来读取 txt 文件并将其写入外部硬盘?
    我目前有一个充满了我想阅读的epub的文件夹,一个我已经阅读过并想再次阅读的epub的文件夹,以及一个相应的文件,其中每个文件都有epub文件的名称。问题是,这些文件夹仅位于我的外部硬盘上。我想要做的是让我的脚本解析这些文件夹中的epub列表,并在我的下载文件夹中创建最新的副......
  • 深入探索:使用Python进行网站数据加载逻辑分析与请求
    作为一名资深的Python程序员,我经常需要从网站中提取数据以供分析或进一步处理。这项任务涉及到对网站数据加载逻辑的深入分析,以及使用Python进行高效的网络请求。在本文中,我将分享如何分析网站的数据加载方式,并使用Python的requests库来模拟浏览器行为,获取所需的数据。网站......
  • 如何将 Python 列表添加到 Excel 中已有值的列的末尾?
    我目前正在尝试编写一个程序,将值附加到列表中,然后将这些值添加到Excel数据表中的列中。每次运行该程序时,我都希望在同一列的末尾添加更多值。所以我不确定如何解决这个问题,而且我在网上找到的其他答案也没有取得多大成功。以下是使用openpyxl库在Python中将......
  • 如何学习Python:糙快猛的大数据之路(学习地图)
    在这个AI和大数据主宰的时代,Python无疑是最炙手可热的编程语言之一。无论你是想转行还是提升技能,学习Python都是一个明智之选。但是,该如何开始呢?今天,让我们聊聊"糙快猛"的Python学习之道。什么是"糙快猛"学习法?"糙快猛"学习法,顾名思义,就是:糙:不追求完美,允许存......
  • Python 中 __get__ 方法的内部原理
    我正在摆弄描述符,结果碰壁了。我以为我可以像使用任何其他方法一样直接调用它,但显然,它似乎不一致或者我遗漏了一些东西。假设我有一个用作描述符的坐标类:|||还有一个Point类,它有2个坐标属性:classCoordinate:def__set_name__(self,owner,name):self._na......
  • 使用带有私钥的云前端生成签名 URL 的问题..使用 Python 3.7 为带有空格的 S3 对象生
    我在使用Python3.7为S3对象生成签名URL时遇到问题。具体来说,键中带有空格的对象的URL会导致“访问被拒绝”错误,而没有空格的对象的URL通常工作正常。但是,并非所有不带空格的对象都能正常工作,带空格的对象始终会失败。fromdatetimeimportdatetime,timedeltaimpo......
  • 有没有更好的方法来在存储库中的一组 python 程序之间共享公共代码
    当我想要快速、轻松地做许多不同的事情时,我会选择Python-即我总是会得到许多Python“程序”-例如一组脚本-或者如果我正在玩一些东西,一堆测试程序等-即始终是许多不同程序的松散集合。但是,我会分享某些内容。例如,如果我正在使用AI-我可能有30个左右完全不相......
  • 如何在Python中从两个不同长度的列表创建DataFrame,为第二个列表中的每个值重复第一个
    我是一个超级初学者,所以请耐心等待。我觉得这应该很容易,但我无法弄清楚。我不确定是否应该创建两个列表,然后将它们组合起来,或者是否有办法以这种方式直接创建DataFrame。我需要一列包含这些值:df=pd.DataFrame({'x1':np.linspace(-2.47,2.69,num=101)})然后我将值A......
  • Python multiprocessing.connection.Connection 的行为不符合规范
    根据python规范,recv()pythonConnection的方法,(从multiprocessing.Pipe()返回,当管道为空且管道的另一端关闭时抛出EOFError(这里参考:https://docs.python.org/3.9/library/multiprocessing.html#multiprocessing.connection.Connection.re......
  • 使用 python Flask 发送邮件中的图像
    我想发送一封包含html代码和图像的电子邮件但在gmail中它说图像已附加,我不想要这样,我只想要电子邮件正文中的图像。html_content=f"<imgsrc="cid:banner"alt=""style="width:80%;">"msg=MIMEMultipart('related')html_part=MIMEText(html_c......