使用crontab(python)运行selenium

2024-09-27 04:22:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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)' 

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


Tags: py脚本homeselenium错误chromeshellchromedriver
3条回答

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

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

例如,如果我将这个命令放在crontab行的command列中,Chrome将在没有问题的情况下启动:

DISPLAY=:0 google-chrome

特定于用户的crontab文件中的完整行如下:

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

如果您想运行一个python脚本,该脚本通过selenium启动chrome,那么这行代码应该如下所示:

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就像我在上面显示的那样,只为下面的命令设置变量。对于crontab执行的所有命令,也可以将DISPLAY设置为:0。例如,在以下特定于用户的crontab中:

DISPLAY=:0

30 * * * *  google-chrome
0  * * * *  python my_script.py

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

Crontab可能是作为一个没有权限访问chromedriver目录/文件的用户运行的。

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

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

相关问题 更多 >

    热门问题