[英]run selenium with crontab (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)'
該錯誤與此問題的第一行代碼有關。 有誰知道為什么會發生這種情況?
嘗試從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
命令字符串只是按原樣發送到外殼程序,因此在最后一個示例中,字符串DISPLAY=:0 python my_script.py
將直接傳遞到外殼程序。 將在命令開始時立即給出的變量賦值解釋為設置環境變量是常見的 shell 語法。 ( dash
和bash
肯定是這種情況,其中之一可能是大多數安裝中的默認shell。)因此,shell 解釋的命令將環境變量DISPLAY
設置為值:0
,然后運行python my_script.py
. 由於python
從啟動它的shell繼承了它的環境,因此變量DISPLAY
也是:0
。
像我上面DISPLAY=:0
那樣設置DISPLAY=:0
僅為后面的命令設置變量。 對於 crontab 執行的所有命令,也可以將DISPLAY
設置為:0
。 例如在以下特定於用戶的 crontab 中:
DISPLAY=:0
30 * * * * google-chrome
0 * * * * python my_script.py
DISPLAY=:0
行為google-chrome
和python my_script.py
的執行設置了環境變量DISPLAY
在 MacOS Catalina 上,只有這個命令對我有用
* * * * * export DISPLAY=:0 && export PATH=$PATH:/usr/local/bin && /usr/bin/python3 ~/Documents/Scripts/my_script.py
使用pyvirtualdisplay 和 Xvfb為您管理窗口會話(最初來自這個答案)
背景:
就我而言,接受的答案不起作用。
解決方案:
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()
selenium Web 驅動程序需要 X 會話來運行腳本。 Cron 腳本通常在沒有 X 會話的情況下運行。 在您的 cron 腳本中添加 X 會話。 如下: * 11 * * * export DISPLAY=:0; 你的腳本.py
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.