簡體   English   中英

使用 crontab (python) 運行 selenium

[英]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 語法。 dashbash肯定是這種情況,其中之一可能是大多數安裝中的默認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-chromepython 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為您管理窗口會話(最初來自這個答案

背景:

就我而言,接受的答案不起作用。

解決方案:

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

selenium Web 驅動程序需要 X 會話來運行腳本。 Cron 腳本通常在沒有 X 會話的情況下運行。 在您的 cron 腳本中添加 X 會話。 如下: * 11 * * * export DISPLAY=:0; 你的腳本.py

Crontab 可能以無權訪問 chromedriver 目錄/文件的用戶身份運行。

查看此處有關如何以特定用戶身份運行 crontab 的答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM