2013-12-13 184 views
4

我已經閱讀了大部分的python/cron在stackoverflow中,但卻無法讓我的腳本運行。我明白,我需要通過shell(使用的zsh & IPython的方式)來運行我的劇本,但我真的不知道該怎麼做:/在crontab中執行Python(selenium)腳本

我簡單的代碼:

在crontab-

*/1 * * * * ipython /home/usr/Data/progs/cron_test.py 

我的Python腳本 -

import pickle 
    from selenium import webdriver 

driver = webdriver.Firefox() 
driver.get('http://www.google.com') 

t=driver.current_url 
pickle.dump(t,open('noreal','wb')) 

我嘗試過的一些事情已經但無濟於事:

#!python ../python etc 
SHELL = /usr/bin/zsh 
PATH =/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 

很簡單,因爲我不知道是什麼問題,我想通過翻譯運行python腳本的東西,但我不知道我在做什麼真的:)

一個工作的解決方案將是巨大的,我真的很感謝解釋隨附任何解決方案,所以我可以理解爲什麼,怎麼樣,而不僅僅是像 '它的工作!謝謝!再見!」

感謝您的幫助!

更新 到目前爲止,我已經縮小的問題,現在蟒蛇運行具有以下設置:

*/3 * * * * /usr/local/bin/ipython /home/user/Data/progs/RF/cron_test.py 

,我得到了一個回溯:

[1;31m---------------------------------------------------------------------------[0m 
[1;31mWebDriverException[0m      Traceback (most recent call last) 
[1;32m/usr/local/lib/python2.7/dist-packages/IPython/utils/py3compat.pyc[0m in [0;36mexecfile[1;34m(fname, *where)[0m 
[0;32m 176[0m    [1;32melse[0m[1;33m:[0m[1;33m[0m[0m 
[0;32m 177[0m     [0mfilename[0m [1;33m=[0m [0mfname[0m[1;33m[0m[0m 
[1;32m--> 178[1;33m    [0m__builtin__[0m[1;33m.[0m[0mexecfile[0m[1;33m([0m[0mfilename[0m[1;33m,[0m [1;33m*[0m[0mwhere[0m[1;33m)[0m[1;33m[0m[0m 
[0m 
[1;32m/home/user/Data/progs/FB/cron_test.py[0m in [0;36m<module>[1;34m()[0m 
[0;32m  9[0m [1;33m[0m[0m 
[0;32m  10[0m [1;33m[0m[0m 
[1;32m---> 11[1;33m [0mdriver[0m [1;33m=[0m [0mwebdriver[0m[1;33m.[0m[0mFirefox[0m[1;33m([0m[1;33m)[0m[1;33m[0m[0m 
[0m[0;32m  12[0m [0mdriver[0m[1;33m.[0m[0mget[0m[1;33m([0m[1;34m'http://www.google.com'[0m[1;33m)[0m[1;33m[0m[0m 
[0;32m  13[0m [1;33m[0m[0m 

[1;32m/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/webdriver.pyc[0m in [0;36m__init__[1;34m(self, firefox_profile, firefox_binary, timeout, capabilities, proxy)[0m 
[0;32m  58[0m   RemoteWebDriver.__init__(self, 
[0;32m  59[0m    command_executor=ExtensionConnection("127.0.0.1", self.profile, 
[1;32m---> 60[1;33m    self.binary, timeout), 
[0m[0;32m  61[0m    desired_capabilities=capabilities) 
[0;32m  62[0m   [0mself[0m[1;33m.[0m[0m_is_remote[0m [1;33m=[0m [0mFalse[0m[1;33m[0m[0m 

[1;32m/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/extension_connection.pyc[0m in [0;36m__init__[1;34m(self, host, firefox_profile, firefox_binary, timeout)[0m 
[0;32m  45[0m   [0mself[0m[1;33m.[0m[0mprofile[0m[1;33m.[0m[0madd_extension[0m[1;33m([0m[1;33m)[0m[1;33m[0m[0m 
[0;32m  46[0m [1;33m[0m[0m 
[1;32m---> 47[1;33m   [0mself[0m[1;33m.[0m[0mbinary[0m[1;33m.[0m[0mlaunch_browser[0m[1;33m([0m[0mself[0m[1;33m.[0m[0mprofile[0m[1;33m)[0m[1;33m[0m[0m 
[0m[0;32m  48[0m   [0m_URL[0m [1;33m=[0m [1;34m"http://%s:%d/hub"[0m [1;33m%[0m [1;33m([0m[0mHOST[0m[1;33m,[0m [0mPORT[0m[1;33m)[0m[1;33m[0m[0m 
[0;32m  49[0m   RemoteConnection.__init__(

[1;32m/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/firefox_binary.pyc[0m in [0;36mlaunch_browser[1;34m(self, profile)[0m 
[0;32m  59[0m [1;33m[0m[0m 
[0;32m  60[0m   [0mself[0m[1;33m.[0m[0m_start_from_profile_path[0m[1;33m([0m[0mself[0m[1;33m.[0m[0mprofile[0m[1;33m.[0m[0mpath[0m[1;33m)[0m[1;33m[0m[0m 
[1;32m---> 61[1;33m   [0mself[0m[1;33m.[0m[0m_wait_until_connectable[0m[1;33m([0m[1;33m)[0m[1;33m[0m[0m 
[0m[0;32m  62[0m [1;33m[0m[0m 
[0;32m  63[0m  [1;32mdef[0m [0mkill[0m[1;33m([0m[0mself[0m[1;33m)[0m[1;33m:[0m[1;33m[0m[0m 

[1;32m/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/firefox_binary.pyc[0m in [0;36m_wait_until_connectable[1;34m(self)[0m 
[0;32m  98[0m     raise WebDriverException("The browser appears to have exited " 
[0;32m  99[0m      [1;34m"before we could connect. The output was: %s"[0m [1;33m%[0m[1;33m[0m[0m 
[1;32m--> 100[1;33m      self._get_firefox_output()) 
[0m[0;32m 101[0m    [1;32mif[0m [0mcount[0m [1;33m==[0m [1;36m30[0m[1;33m:[0m[1;33m[0m[0m 
[0;32m 102[0m     [0mself[0m[1;33m.[0m[0mkill[0m[1;33m([0m[1;33m)[0m[1;33m[0m[0m 

[1;31mWebDriverException[0m: Message: 'The browser appears to have exited before we could connect. The output was: Error: no display specified\n' 
+1

'ipython'對這種*非交互使用的縮影有什麼好處? – tripleee

+0

不,我想,這對於這個問題很重要嗎?我不介意使用普通的Python –

+0

「你已經嘗試過的東西」的意義是什麼?它們中沒有一個在語法上是正確的。一個正確的shebang就像'#!/ usr/bin/env python'一樣,並且賦值不能包含任何空格。 – tripleee

回答

3

快速猜測,您的作業無法運行,因爲它需要X會話。您應該設置您的測試腳本以無頭模式運行。檢查此鏈接到run selenium in a headless mode.

更新:
你的痕跡說,正是我的意思是,如果你想Firefox不無X上運行,或顯示器。

The output was: Error: no display specified\n' 

爲自己節省更多的麻煩,請閱讀我發佈的鏈接。

+0

我搬到了一些簡單的東西,只是爲了檢查,沒有pickle.dump列表到一個文件,沒有創建文件,所以我把它作爲證明它仍然沒有工作。 –

+0

您是否看到錯誤?你的腳本中斷了嗎?其他cronjobs的工作? – Oz123

+0

一個簡單的cronjob工作:echo'你好單詞'>> /tmp/hello.txt,在python的情況下我什麼都看不到,所以我不能回溯這個問題.. –

7

可以看出here,你需要給的cron顯示:

30 5 * * * export DISPLAY=:0; /home/me/good_morning.sh 
-1

安裝的Xvfb或Xephyr或Xvnc的。還要安裝pyvirtualdisplay python模塊。這是針對Ubuntu 14.04的,並在16.04上進行了測試。

sudo apt-get install python-pip 
sudo apt-get install xvfb xserver-xephyr vnc4server 
sudo pip install pyvirtualdisplay 
# optional 
sudo apt-get install python-pil scrot 
sudo pip install pyscreenshot 

現在你可以從你的python腳本啓動Xvfb了。當你的腳本被執行時它會啓動Xvfb。將以下行添加到您的代碼中。

from pyvirtualdisplay import Display 
display = Display(visible=0, size=(1024, 768)) 
display.start() 

以下是示例代碼。

from pyvirtualdisplay import Display 
from selenium import webdriver 

display = Display(visible=0, size=(1024, 768)) 
display.start() 
browser = webdriver.Firefox() 
browser.get('http://www.google.com') 
print browser.title 
browser.quit() 

display.stop() 

現在你可以在你的crontab中提到該程序。但是隻添加ipython的路徑而不是ipython。

0 * * * * /usr/bin/python /home/usr/Data/progs/cron_test.py build