我正在运行一个 Django 服务,该服务启动用于 selenium 的 chromedriver 并抓取网站上的数据。 Django 服务由另一个Java 服务通过HTTP 调用。
这是代码:
views.py
path_to_chromedriver = '/path/to/chromedriver'
browser = webdriver.Chrome(executable_path = path_to_chromedriver)
try:
response = get_data(browser)
except Exception as e:
print str(e)
finally:
browser.close()
browser.quit()
scraper.py
get_data(browser)
try:
.
.
.
for i in range(1,6):
try:
.
.
.
return "success data"
except NoSuchElementException:
browser.back()
raise Exception("No results found")
except Exception as e:
print str(e)
raise
问题是,在 java 服务完成所有调用并且整个过程完成后,有 25 - 50 个 chrome 进程在占用超过 1 GB 的 RAM 中处于孤立状态。我在这里做错了什么吗?
这是一个老问题了。对我来说,虽然肮脏,但最有效的是在戒烟前补充睡眠:
time.sleep(5)
browser.quit()
退出前不要关闭,并通过 try/ except 包围代码。
try:
browser.quit()
except WebDriverException:
pass
想要扩展@Serge B给出的答案。
使用 browser.quit() 确实比 browser.close() 更好,因为最后一个可能只关闭当前窗口,而第一个窗口将关闭所有窗口(和所有进程)。
但我认为这样做并不能解决你的问题。
我遇到了同样的问题 - 驱动程序在由 Java 进程运行时不会关闭。我在使用 TeamCity 运行测试时遇到了这个问题。请尝试在没有您使用的 Java 服务的情况下运行您的代码,并确保这是问题所在。
如果是这个问题,那么我建议通过Python方法杀死所有进程。这是我使用的解决方案并且对我有用。不幸的是,我当时使用了 C#,下一个代码帮助了我 https://stackoverflow.com/a/35692319/4019586 但它不是你现在可以使用的。
我不知道如何在 Python 上执行此操作,但这可能是您的解决方案。 我认为使用 Python 这会起作用 https://stackoverflow.com/a/6278951/4019586.
所以积极的一面是你做的都是正确的!)这只是 Selenium 中的一个错误。
您需要在
driver.close()
之前调用 driver.quit()
,否则您会遇到资源使用率很高的持久 chrome 进程。这是最新 chrome 版本 (124+) 的问题。