在Heroku上使用Python selenium运行ChromeDriver

12

我在Heroku上有一个Flask服务器,一直以来都按照预期工作得很好。现在,根据新的要求,我需要为Flask服务器添加功能,以便从外部网站获取页面。由于某些原因,我正在使用Selenium和Chrome Web Driver完成此操作。在本地,我能够设置并正常运行,但是我不确定如何在Heroku服务器上设置它。我了解了一些构建包,并找到了这个Chrome驱动程序的构建包:

https://elements.heroku.com/buildpacks/jimmynguyc/heroku-buildpack-chromedriver

然而,我不确定该如何进一步操作。我应该如何安装Chromium浏览器本身以及需要什么其他东西来绑定它呢?

3个回答

25

我遇到了同样的问题,以下步骤对我很有效:

  • 在Heroku上添加了以下构建包: https://github.com/heroku/heroku-buildpack-xvfb-google-chrome (用于安装Chrome,因为Chromedriver需要它)以及 https://github.com/heroku/heroku-buildpack-chromedriver
  • 创建了一个名为GOOGLE_CHROME_BIN的环境变量,其中包含Heroku上Chrome的路径:/app/.apt/usr/bin/google-chrome,并创建了一个名为CHROMEDRIVER_PATH的环境变量,其中包含Heroku上Chromedriver的路径:/app/.chromedriver/bin/chromedriver。
  • 在我的Python文件中,我配置了Chromedriver:

    chrome_options = Options()
    chrome_options.binary_location = GOOGLE_CHROME_BIN
    chrome_options.add_argument('--disable-gpu')
    chrome_options.add_argument('--no-sandbox')
    driver = webdriver.Chrome(executable_path=CHROMEDRIVER_PATH, chrome_options=chrome_options)
    

(首先,我尝试了没有参数配置chromedriver,但我遇到了以下错误:“Chrome启动失败:崩溃”。使用--disable-gpu和--no-sandbox解决了我的问题。)


3
感谢您抽出时间回复这个较旧的问题,它通过在Heroku上使用额外的构建包解决了我的问题。 - Russell D
嗨,@Russell D,你能分享一下你的解决方案吗? - Ronnie
@Ronnie - 我按照Emanoeli M提供的解决方案进行了操作...不幸的是,我拆除了我的Heroku部署应用程序...我一直在为它们付费,但没有使用它们所做的事情,所以我断开了插头并删除了我设置的实例,因此我无法访问我所做的内容。 - Russell D
@Russell,感谢您的回复。我已经成功让它工作了,但性能不稳定。有时它无法找到元素并超时。https://stackoverflow.com/questions/56661348/chromedriver-timesout-while-trying-to-locate-a-element - Ronnie

1
在您的Heroku应用程序中,转到“设置”并添加以下构建包: 此外,在您的Python脚本中,您需要设置一些Chrome选项,以便您的脚本在Heroku上运行时不会出错。
import time

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

gChromeOptions = webdriver.ChromeOptions()
gChromeOptions.add_argument("window-size=1920x1480")
gChromeOptions.add_argument("disable-dev-shm-usage")
gDriver = webdriver.Chrome(
    chrome_options=gChromeOptions, executable_path=ChromeDriverManager().install()
)
gDriver.get("https://www.python.org/")
time.sleep(3)
gDriver.save_screenshot("my_screenshot.png")
gDriver.close()

如果您仍然遇到问题,这里是我创建的更详细的帖子: https://www.jtrocinski.com/posts/Heroku-Use_Selenium_to_run_Google_Chrome_in_Python.html


0

对于pyppeteer

如果任何人正在运行在Heroku上,并且面临相同的错误:

添加buildpack:buildpack的URL如下:

https://github.com/jontewks/puppeteer-heroku-buildpack

请确保您正在使用--no-sandbox模式

launch({ args: ['--no-sandbox'] })

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接