繁体   English   中英

在 crontab 中执行 Python (selenium) 脚本

[英]Execute Python (selenium) script in crontab

我已经阅读了 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' 

正如这里看到的,你需要给 cron 一个显示:

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

快速猜测,您的作业无法运行,因为它需要 X 会话。 您应该将测试脚本设置为在无头模式下运行。

更新:
您的跟踪准确地说明了我的意思,firefox 不会在没有 X 的情况下运行,或者如果您愿意,也不会显示。

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

为自己省去更多麻烦,请阅读我发布的链接。

你可以在没有 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)

这不是最好的解决方案,但它有效。

这个问题困扰了我近 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 中 selenium 正常工作的方法,而不会在 DigitalOcean 服务器中感到头疼。 路径将根据您的服务器和程序位置而有所不同。

安装 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM