用crontab(python)运行selenium

时间:2014-05-28 09:52:48

标签: python ubuntu selenium crontab

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

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

从shell脚本调用python脚本。

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)' 

该错误与此问题的第一行代码有关。有谁知道为什么会发生这种情况?

5 个答案:

答案 0 :(得分:7)

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

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

例如,如果我在:0行中使用此命令,Chrome就会毫无问题地启动:

crontab

答案 1 :(得分:1)

Crontab可能作为无权访问chromedriver目录/文件的用户运行。

查看有关如何以特定用户身份运行crontab的answers here

答案 2 :(得分:1)

selenium web驱动程序需要X会话才能运行脚本。 Cron脚本通常在没有X会话的情况下运行。在您的cron脚本中添加X会话。如下: * 11 * * * export DISPLAY =:0;你的script.py

答案 3 :(得分: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()

答案 4 :(得分:0)

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

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