2013-12-13 148 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