为什么Selenium Node PhantomJS在Python脚本结束后仍在运行?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了为什么Selenium Node PhantomJS在Python脚本结束后仍在运行?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1749字,纯文字阅读大概需要3分钟。
内容图文
![为什么Selenium Node PhantomJS在Python脚本结束后仍在运行?](/upload/InfoBanner/zyjiaocheng/678/a8637e55ed0e40ff817bcaa8e489ba0e.jpg)
我正在使用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().
内容总结
以上是互联网集市为您收集整理的为什么Selenium Node PhantomJS在Python脚本结束后仍在运行?全部内容,希望文章能够帮你解决为什么Selenium Node PhantomJS在Python脚本结束后仍在运行?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。