我有一个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)'
该错误与此问题的第一行代码有关。有谁知道为什么会发生这种情况?
答案 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)
背景:
就我而言,接受的答案不起作用。
解决方案:
pip3 install pyvirtualdisplay
sudo apt-get install xvfb
.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