我在 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