首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用crontab运行selenium (python)

使用crontab运行selenium (python)
EN

Stack Overflow用户
提问于 2014-05-28 09:52:48
回答 5查看 15.7K关注 0票数 18

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

代码语言:javascript
复制
 ff = webdriver.Chrome('/home/user01/webScraping/CollectAndGo/chromedriver')

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

代码语言:javascript
复制
python /home/user01/webScraping/CollectAndGo/cgcom.py > /home/user01/webScraping/CollectAndGo/cgcom.log 2>&1

当我从终端运行脚本或只执行.sh文件时,它工作得很完美,但是当我安排一个crontab作业时,它会失败,下一个错误就会失败。

代码语言:javascript
复制
   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)' 

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-05-28 16:43:54

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

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

例如,如果我将此命令放在command行的crontab列中,则Chrome启动时没有问题:

代码语言:javascript
复制
DISPLAY=:0 google-chrome

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

代码语言:javascript
复制
0 * * * *  DISPLAY=:0 google-chrome

如果您想运行一个通过selenium启动chrome的python脚本,那么该行将改为如下所示:

代码语言:javascript
复制
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中:

代码语言:javascript
复制
DISPLAY=:0

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

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

票数 32
EN

Stack Overflow用户

发布于 2020-05-10 21:33:55

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

代码语言:javascript
复制
* * * * * export DISPLAY=:0 && export PATH=$PATH:/usr/local/bin && /usr/bin/python3 ~/Documents/Scripts/my_script.py
票数 1
EN

Stack Overflow用户

发布于 2021-03-04 03:13:16

使用pyvirtualdisplay和Xvfb为您管理窗口会话(最初来自这个答案)

背景:

就我而言,公认的答案是行不通的。

解决方案:

  1. 安装PyVirtualDisplay和Xvfb
代码语言:javascript
复制
pip3 install pyvirtualdisplay
sudo apt-get install xvfb
  1. .py脚本中分配窗口处理程序
代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23908319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档