【问题标题】:run selenium with crontab (python)使用 crontab (python) 运行 selenium
【发布时间】:2014-07-17 11:33:55
【问题描述】:

我有一个 python 脚本,它通过 selenium 调用 chrome,下一行。

 ff = webdriver.Chrome('/home/user01/webScraping/CollectAndGo/chromedriver')

python 脚本是从 shell 脚本调用的。

python /home/user01/webScraping/CollectAndGo/cgcom.py > /home/user01/webScraping/CollectAndGo/cgcom.log 2>&1

当我从终端运行脚本或仅执行 .sh 文件时,它运行良好,但是当我安排 crontab 作业时,它会失败并出现下一个错误。

   raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: u'unknown error: Chrome failed to start: exited abnormally\n  (Driver info: chromedriver=2.9.248304,platform=Linux 3.5.0-36-generic x86_64)' 

错误与本题第一行代码有关。有人知道为什么会这样吗?

【问题讨论】:

    标签: python ubuntu selenium crontab


    【解决方案1】:

    使用pyvirtualdisplay and Xvfb 为您管理窗口会话(最初来自this answer

    背景:

    就我而言,接受的答案不起作用。

    解决方案:

    1. 安装 PyVirtualDisplay 和 Xvfb
    pip3 install pyvirtualdisplay
    sudo apt-get install xvfb
    
    1. .py 脚本中分配窗口处理程序
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    from pyvirtualdisplay import Display
    import time
    
    # Display creates a virtual frame buffer and manages it for you
    with Display(visible=False, size=(1200, 1500)):
        driver = webdriver.Firefox()
        driver.get("https://website-target.com")
    
        time.sleep(1)
    
        print(driver.current_url) # check connection
    
        time.sleep(1)
    
        print(driver.current_url)
    
        driver.close()
    
    

    【讨论】:

      【解决方案2】:

      在 MacOS Catalina 上,只有这个命令对我有用

      * * * * * export DISPLAY=:0 && export PATH=$PATH:/usr/local/bin && /usr/bin/python3 ~/Documents/Scripts/my_script.py
      

      【讨论】:

        【解决方案3】:

        尝试从cron 启动浏览器最明显的问题是,即使您的机器上运行了X,也没有为从crontab 运行的进程设置DISPLAY 环境变量,因此启动浏览器从那里将失败。

        解决方案范围从琐碎到超级复杂。一个简单的解决方案是接受如果没有 X 运行,您的脚本将不会运行,并手动将 DISPLAY 设置为 :0,这是 Ubuntu 启动的默认 X 服务器的默认显示编号。

        例如,如果我将此命令放在 crontab 行的 command 列中,Chrome 将毫无问题地启动:

        DISPLAY=:0 google-chrome
        

        用户特定的 crontab 文件中的完整行类似于:

        0 * * * *  DISPLAY=:0 google-chrome
        

        如果您想运行通过 selenium 启动 chrome 的 python 脚本,则该行将如下所示:

        0 * * * *  DISPLAY=:0 python my_script.py
        

        命令字符串按原样发送到 shell,因此在最后一个示例中,字符串 DISPLAY=:0 python my_script.py 将直接传递给 shell。将命令开始时立即给出的变量赋值解释为设置环境变量是常见的 shell 语法。 (dashbash 肯定是这种情况,其中一个很可能是大多数安装中的默认 shell。)因此 shell 解释的命令将环境变量 DISPLAY 设置为值 :0然后运行python my_script.py。因为python 从启动它的shell 继承了它的环境,所以变量DISPLAY 也是:0

        设置DISPLAY=:0 就像我在上面显示的那样为后面的命令设置变量only。对于 crontab 执行的所有命令,也可以将 DISPLAY 设置为 :0。例如在以下用户特定的 crontab 中:

        DISPLAY=:0
        
        30 * * * *  google-chrome
        0  * * * *  python my_script.py
        

        DISPLAY=:0 行设置了环境变量DISPLAY 用于执行google-chromepython my_script.py

        【讨论】:

        • 耶哈,成功了!谢谢! (你们是怎么知道这些事情的?!)
        • 您会在脚本所在的同一行还是在不同的行上使用它?即,1 = 0 * * * * python3 my_script.py DISPLAY=:0 google-chrome 或 2 =DISPLAY=:0 google-chrome [\n] 0 * * * * python3 my_script.py?
        • @JessicaChambers 我已经编辑了我的答案来解释。你的选择都不完全正确。
        • 当然,如果您没有登录到您的桌面,:0 上不会有正在运行的 X 会话。一个强大的解决方案会从您的 cron 作业中启动一个单独的 Xvfb 服务器,然后在新的无头会话中运行 Chrome。这会带来许多额外的复杂性,因此肯定需要在稳健性和简单性之间进行权衡。
        【解决方案4】:

        selenium 网络驱动程序需要 X 会话来运行脚本。 Cron 脚本通常在没有 X 会话的情况下运行。在您的 cron 脚本中添加 X 会话。如下所示: * 11 * * * 导出显示=:0;你的脚本.py

        【讨论】:

          【解决方案5】:

          Crontab 可能以无权访问 chromedriver 目录/文件的用户身份运行。

          查看answers here,了解如何以特定用户身份运行 crontab。

          【讨论】:

          • 不,用户的东西是对的,他有执行chromedriver的权限。
          猜你喜欢
          • 1970-01-01
          • 2013-09-02
          • 2021-09-10
          • 2017-02-05
          • 2020-09-04
          • 2016-06-18
          • 2017-11-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多