我已经在stackoverflow中读取了大部分python / cron,但却无法运行我的脚本。我明白我需要通过shell运行我的脚本(顺便使用zsh& ipython),但实际上我不知道该怎么做:/
我的简单代码:
在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脚本,但我不知道我在做什么:)
一个可行的解决方案会很棒,我真的很感激为任何解决方案提供解释,以便我能理解为什么以及如何而不仅仅是 '有用!谢谢!再见!“
感谢您的帮助!
更新 到目前为止,我已经缩小了问题范围,现在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'
答案 0 :(得分:10)
如here所示,你需要给cron一个显示:
30 5 * * * export DISPLAY=:0; /home/me/good_morning.sh
答案 1 :(得分:4)
快速猜测,您的作业无法运行,因为它需要X会话。您应该将测试脚本设置为以无头模式运行。点击此链接至run selenium in a headless mode.
更新:
你的描述正是我的意思,firefox不能在没有X的情况下运行,或者如果你想要显示。
The output was: Error: no display specified\n'
省去更多麻烦,请阅读我发布的链接。
答案 2 :(得分:1)
你可以在没有crontab的情况下完成。
我找到了时间表模块: GIThub/schedule
现在您的代码应如下所示:
import schedule
import time
def job():
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'))
schedule.every(1).minutes.do(job)
while True:
schedule.run_pending()
time.sleep(1)
这不是最佳解决方案,但可行。
答案 3 :(得分:1)
这个问题困扰了我近6个小时。
因此,如果我在终端中写入/usr/bin/python3 -u /root/apps/bridge/cinkselenium.py
,就可以正常工作。
但是不适用于crontab。对吧?
添加
from pyvirtualdisplay import Display
display = Display(visible=0, size=(800, 600))
display.start()
将无济于事。
您需要制作一个shell脚本并编写以下内容-
#!/usr/bin/env bash
export DISPLAY=:0
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
nohup /usr/bin/python3 -u /root/apps/bridge/cinkselenium.py > /root/apps/bridge/cinkselenium.log &y
现在从Crontab运行shell脚本-
* * * * * /root/apps/bridge/cinkselenium.sh
这对于crontab中的硒正常运行,而在DigitalOcean服务器中不会出现麻烦。路径将根据您的服务器和程序位置而有所不同。
答案 4 :(得分:-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