运行几次后无头脚本崩溃
Headless script crashes after a few runs
我有一个使用无头浏览器的脚本,我 运行 使用 crontab -e
。它在前几次运行良好,然后因以下回溯而崩溃:
Traceback (most recent call last):
File "/home/clint-selenium-firefox.py", line 83, in <module>
driver.get(url)
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 248, in get
self.execute(Command.GET, {'url': url})
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 236, in execute
self.error_handler.check_response(response)
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 192, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: Failed to decode response from marionette
我的 crontab 行是:
*/10 * * * * export DISPLAY=:0 && python /home/clint-selenium-firefox.py >> /home/error.log 2>&1
我不想用 python 脚本重载它,所以我已经删除了我认为相关的部分。
from pyvirtualdisplay import Display
display = Display(visible=0, size=(800, 600))
display.start()
...
driver = webdriver.Firefox()
driver.get(url)
...
driver.quit()
...
display.stop()
非常感谢您的帮助。
编辑
版本:Firefox 49.0.2;硒:3.0.1; geckodriver:geckodriver-v0.11.1-linux64.tar.gz
错误代码(在 driver.get(url)
上失败):
driver = webdriver.Firefox()
if DEBUG: print "Opened Firefox"
for u in urls:
list_of_rows = []
list_of_old_rows = []
# get the old version of the site data
mycsvfile = u[1]
try:
with open(mycsvfile, 'r') as csvfile:
old_data = csv.reader(csvfile, delimiter=' ', quotechar='|')
for o in old_data:
list_of_old_rows.append(o)
except: pass
# get the new data
url = u[0]
if DEBUG: print url
driver.get(url)
if DEBUG: print driver.title
time.sleep(1)
page_source = driver.page_source
soup = bs4.BeautifulSoup(page_source,'html.parser')
来自 Multiple Firefox instances failing with NS_ERROR_SOCKET_ADDRESS_IN_USE #99 这是因为没有将 --marionette-port 选项传递给 geckodriver - 这意味着 geckodriver 启动 firefox 的所有实例都传递相同的所需默认端口 ( 2828).第一个 firefox 实例绑定到该端口,未来的实例不能,所有 geckodriver 实例最终连接到第一个 firefox 实例 - 这会产生各种不可预测的行为。
后跟:我认为一个合理的短期解决方案是做其他驱动程序正在做的事情,并要求 Marionette 绑定到由 geckodriver 生成的随机自由端口。目前它使用 2828 作为它生成的所有 Firefox 实例的默认值。
由于 Marionette 不幸的是还没有一种带外的方式将端口传回客户端(geckodriver),这本质上是活泼的,但我们可以在未来通过 bug 中的一个建议来改善这种情况1240830.
此 change 制作于
Selenium 3.0.0.b2
* Updated Marionette port argument to match other drivers.
我想随机只适用这么久。提出一个issue。您拥有的 selenium、firefox 和 geckodriver 版本可能需要代码修复。您可以退回使用 Selenium 2.53.0 和 firefox esr 38.8,直到此问题得到修复。你来电。
更新:尝试
from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
binary = FirefoxBinary('path/to/binary')
driver = webdriver.Firefox(firefox_binary=binary)
我有一个使用无头浏览器的脚本,我 运行 使用 crontab -e
。它在前几次运行良好,然后因以下回溯而崩溃:
Traceback (most recent call last):
File "/home/clint-selenium-firefox.py", line 83, in <module>
driver.get(url)
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 248, in get
self.execute(Command.GET, {'url': url})
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 236, in execute
self.error_handler.check_response(response)
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 192, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: Failed to decode response from marionette
我的 crontab 行是:
*/10 * * * * export DISPLAY=:0 && python /home/clint-selenium-firefox.py >> /home/error.log 2>&1
我不想用 python 脚本重载它,所以我已经删除了我认为相关的部分。
from pyvirtualdisplay import Display
display = Display(visible=0, size=(800, 600))
display.start()
...
driver = webdriver.Firefox()
driver.get(url)
...
driver.quit()
...
display.stop()
非常感谢您的帮助。
编辑
版本:Firefox 49.0.2;硒:3.0.1; geckodriver:geckodriver-v0.11.1-linux64.tar.gz
错误代码(在 driver.get(url)
上失败):
driver = webdriver.Firefox()
if DEBUG: print "Opened Firefox"
for u in urls:
list_of_rows = []
list_of_old_rows = []
# get the old version of the site data
mycsvfile = u[1]
try:
with open(mycsvfile, 'r') as csvfile:
old_data = csv.reader(csvfile, delimiter=' ', quotechar='|')
for o in old_data:
list_of_old_rows.append(o)
except: pass
# get the new data
url = u[0]
if DEBUG: print url
driver.get(url)
if DEBUG: print driver.title
time.sleep(1)
page_source = driver.page_source
soup = bs4.BeautifulSoup(page_source,'html.parser')
来自 Multiple Firefox instances failing with NS_ERROR_SOCKET_ADDRESS_IN_USE #99 这是因为没有将 --marionette-port 选项传递给 geckodriver - 这意味着 geckodriver 启动 firefox 的所有实例都传递相同的所需默认端口 ( 2828).第一个 firefox 实例绑定到该端口,未来的实例不能,所有 geckodriver 实例最终连接到第一个 firefox 实例 - 这会产生各种不可预测的行为。
后跟:我认为一个合理的短期解决方案是做其他驱动程序正在做的事情,并要求 Marionette 绑定到由 geckodriver 生成的随机自由端口。目前它使用 2828 作为它生成的所有 Firefox 实例的默认值。 由于 Marionette 不幸的是还没有一种带外的方式将端口传回客户端(geckodriver),这本质上是活泼的,但我们可以在未来通过 bug 中的一个建议来改善这种情况1240830.
此 change 制作于
Selenium 3.0.0.b2
* Updated Marionette port argument to match other drivers.
我想随机只适用这么久。提出一个issue。您拥有的 selenium、firefox 和 geckodriver 版本可能需要代码修复。您可以退回使用 Selenium 2.53.0 和 firefox esr 38.8,直到此问题得到修复。你来电。
更新:尝试
from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
binary = FirefoxBinary('path/to/binary')
driver = webdriver.Firefox(firefox_binary=binary)