我正在使用PhantomJS收集有关HTML页面的数据.我的代码是这样的:
from selenium import webdriver
class PageElements():
def __init__(self, url):
self.driver = webdriver.PhantomJS()
self.driver.get(url)
self.elements, self.attribute_types = self._load_elements(self.driver)
def _load_elements(self, self.driver)
""""This is not relevant"""
因此,有时我在IPython Notebook上执行代码后,进行测试.一段时间后,我在“活动监视器”上得到了这个:
和这个:
def __del__(self):
self.driver.close()
怎么了?我会很感激一个“为什么会这样”的答案,而不是一个“做到这一点”的答案.为什么我的驱逐舰不起作用?
我打开了@forivall链接,并看到了Selenium代码. PhantomJS webdriver有它自己的析构函数(因此使我的成为多余的).他们为什么在这种情况下不工作?
解决方法:
__del __()在python中往往不可靠.您不仅不知道何时调用它,甚至没有任何保证可以调用它. try / finally构造,或(甚至更好的)with-blocks(又称上下文管理器),要可靠得多.
也就是说,即使使用上下文管理器,我也遇到类似的问题. phantomjs进程到处都在运行.我通过硒调用phantomjs,如下所示:
from selenium import webdriver
from contextlib import closing
with closing(webdriver.PhantomJS()) as driver:
do_stuff(driver)
contextlib的close()函数可确保无论发生什么情况都调用其参数的close()方法,但事实证明,driver.close()(如果可用)是清理webdriver会话的错误方法. driver.quit()是清理的正确方法.因此,请执行以下操作之一,而不是执行上面的操作:
from selenium import webdriver
from contextlib import contextmanager
@contextmanager
def quitting(quitter):
try:
yield quitter
finally:
quitter.quit()
with quitting(webdriver.PhantomJS()) as driver:
do_stuff(driver)
要么
from selenium import webdriver
driver = webdriver.PhantomJS()
try:
do_stuff(driver)
finally:
driver.quit()
(以上两个片段是等效的)
值得一提的是@Richard对原始问题的评论,以使我指向.quit().
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。