【问题标题】:Issue running Selenium on AWS Lambda在 AWS Lambda 上运行 Selenium 的问题
【发布时间】:2019-09-28 14:58:35
【问题描述】:

我目前正在尝试实现一个抓取工具,它会每天检查两次是否某些 PDF 更改名称。不幸的是,它需要网站操作才能找到 pdf,所以我认为最好的解决方案是 Selenium 和 AWS Lambda 的组合。

一开始我关注的是this 教程。我已经完成了教程,但在 Lambda 中遇到了这个错误:

START RequestId: 18637c6d-ea75-40ee-8789-374654700b99 Version: $LATEST
Starting google.com
Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home
: WebDriverException
Traceback (most recent call last):
  File "/var/task/lambda_function.py", line 46, in lambda_handler
    driver = webdriver.Chrome(chrome_options=chrome_options)
  File "/var/task/selenium/webdriver/chrome/webdriver.py", line 68, in __init__
    self.service.start()
  File "/var/task/selenium/webdriver/common/service.py", line 83, in start
    os.path.basename(self.path), self.start_error_message)
selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home

这个错误是别人遇到的,作者通过链接this堆栈溢出页面“解决”。我已经尝试过它,但所有答案都与在桌面上使用无头铬而不是 AWS lambda 有关。

我尝试了一些更改无济于事。

1) 将 chromedriver 和 headless-chromium 更改为 .exe 文件
2) 更改这行代码以包含 executable_path

driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=os.getcwd() + "/bin/chromedriver.exe")

如果能帮助 selenium 和 aws lambda 一起工作,我们将不胜感激。

【问题讨论】:

  • 您是否已将下载的 chromium 文件添加为部署包的一部分,如果是,请尝试将驱动程序命令的路径更改为以下内容:driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=os.getcwd() + "./chromedriver.exe")
  • 很抱歉回复晚了,但我尝试使用“./”但仍然收到相同的错误

标签: python selenium aws-lambda


【解决方案1】:

我也遇到了同样的问题,但我现在已经解决了。就我而言,这是 lambda 和 My Dockerfile 上的 python 版本不同。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,这是由于二进制文件位于无法执行它们的位置。添加一个功能来移动它们,然后从该位置读取它们修复它。请参阅下面的示例,该示例是我在研究此错误时才开始工作的。 (为混乱的代码道歉。)

    import time
    import os
    from selenium import webdriver
    from fake_useragent import UserAgent
    
    import subprocess
    import shutil
    import time
    
    BIN_DIR = "/tmp/bin"
    CURR_BIN_DIR = os.getcwd() + "/bin"
    
    def _init_bin(executable_name):
        start = time.clock()
        if not os.path.exists(BIN_DIR):
            print("Creating bin folder")
            os.makedirs(BIN_DIR)
        print("Copying binaries for " + executable_name + " in /tmp/bin")
        currfile = os.path.join(CURR_BIN_DIR, executable_name)
        newfile = os.path.join(BIN_DIR, executable_name)
        shutil.copy2(currfile, newfile)
        print("Giving new binaries permissions for lambda")
        os.chmod(newfile, 0o775)
        elapsed = time.clock() - start
        print(executable_name + " ready in " + str(elapsed) + "s.")
    
    def handler(event, context):
    
        _init_bin("headless-chromium")
        _init_bin("chromedriver")
    
        chrome_options = webdriver.ChromeOptions()
    
        chrome_options.add_argument('--headless')
        chrome_options.add_argument('--disable-gpu')
        chrome_options.add_argument('--window-size=1280x1696')
        chrome_options.add_argument('--no-sandbox')
        chrome_options.add_argument('--hide-scrollbars')
        chrome_options.add_argument('--enable-logging')
        chrome_options.add_argument('--log-level=0')
        chrome_options.add_argument('--v=99')
        chrome_options.add_argument('--single-process')
        chrome_options.add_argument('--ignore-certificate-errors')
    
        chrome_options.binary_location = "/tmp/bin/headless-chromium"
        driver = webdriver.Chrome("/tmp/bin/chromedriver", chrome_options=chrome_options)
        driver.get('https://en.wikipedia.org/wiki/Special:Random')
        line = driver.find_element_by_class_name('firstHeading').text
        print(line)
        driver.quit()
    
        return line
    
    

    【讨论】:

    • 我正在尝试您的解决方案,但我仍然收到来自 selenium 的“消息:无法连接到服务 /tmp/bin/chromedriver”错误。你以前遇到过这种情况吗?你使用的是什么版本的 selenium、chromedriver 和 headless-chromium?
    • 我不记得那个错误了。如果您克隆和下载 github.com/ryfeus/lambda-packs/tree/master/Selenium_Chromium/…,我正在使用包含的二进制和 chrome 驱动程序
    • 我意识到我没有更改我的 PYTHONPATH,我认为这解决了我的问题。
    • 我遵循了您的解决方案。但是,之后我得到了这个"errorMessage": "[Errno 2] No such file or directory: '/var/task/bin/headless-chromium'",。你碰巧知道原因吗?我在 AWS lambda 上运行它,似乎 bin 目录没有我试图复制到 /tmp 的可执行文件
    • 是的,看起来确实如此。我强烈建议您使用 AWS SAM 让您通过 docker 在桌面上进入类似 lambda 的环境。它会让你四处寻找并确保你有权限并且文件确实存在。也使部署更加容易。
    猜你喜欢
    • 2022-11-24
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多