当前位置: 首页 > 知识库问答 >
问题:

无法通过Python中的Selenium杀死Chrome进程并使用ChromeDriver和Chrome耗尽内存

夏志国
2023-03-14

我有一个爬行过程,在自定义类中启动selenium,如下所示:

class BrowserInterface:

def __init__(self, base_url, proxy_settings):

    self.base_url = base_url

    self.display = Display(visible=0, size=(1024, 768))
    self.display.start()

    proxy_argument = '--proxy-server={0}'.format(PROXY_URL.format(
        proxy_settings.get('proxy_host'),
        proxy_settings.get('proxy_port')
    ))

    logger.debug(proxy_argument)

    options = webdriver.ChromeOptions()
    options.add_argument('--no-sandbox')
    options.add_argument(proxy_argument)

    selenium_chrome_driver_path = os.path.join(settings.DEFAULT_DRIVER_PATH,
                                               settings.CHROME_DRIVERS[settings.CURRENT_OS])

    self.driver = webdriver.Chrome(executable_path=selenium_chrome_driver_path, chrome_options=options)

def visit(self, url):
    url = urljoin(self.base_url, url)
    self.driver.get(url)

def body(self):
    soup = BeautifulSoup(self.driver.page_source)
    return soup.find("body").text

def quit(self):
    self.driver.quit()
    self.display.stop()

此BrowserInterface类在批处理队列中初始化,并在批处理结束时调用quit()方法。启动chrome和获取数据都没有问题。问题是,在每个作业结束时,当quit()方法被调用时,chrome会进入僵尸模式。当下一个BrowserInterface初始化时,它将启动一个新的chrome实例。因此,该框的html" target="_blank">内存不足。我也尝试在chrome进程上运行a kill命令,但它仍在运行。任何方向都将不胜感激,因为我即将为此拔出我的头发。

运行在Ubuntu 18.04、Google Chrome 70.0.3538.110、ChromeDriver 2.44、Python3上。6.6

提前感谢!

共有1个答案

夏侯渊
2023-03-14

从您的代码测试中,很明显您调用了self。驾驶员quit(),它应该工作得很好。

但是,由于zombie chrome进程的原因,框内存仍然不足,因此您采取了正确的方法来执行a kill命令,并且可以在quit()方法中添加以下解决方案:

from selenium import webdriver
import psutil

driver = webdriver.Chrome()
driver.get('http://google.com/')

PROCNAME = "chrome" # to clean up zombie Chrome browser
#PROCNAME = "chromedriver" # to clean up zombie ChromeDriver
for proc in psutil.process_iter():
    # check whether the process name matches
    if proc.name() == PROCNAME:
        proc.kill()
 类似资料:
  • 我们使用spring Boot开发了基于selenium的web应用程序。服务器位于google cloud服务器上作为VM实例。 我们有一个使用Executor的线程基机制。使用selenium,我们打开一个chrome浏览器(无头)来执行操作,并为每个操作创建新线程。 请在下面找到版本的详细信息。 Spring Boot-2.0.0版本 硒-3.9.1 请使用以下资源报告:。 此外,我使用检查

  • 问题内容: 我正在使用Selenium Chrome Webdriver在Python 3中打开网页。我希望有一个可以打开网页的功能。我最初有: 我把它放在函数goTo()中 但是,我无法在该页面上执行该goTo函数之外的任何其他操作。尝试时出现错误: 有谁知道我该如何使用函数正确打开页面? 问题答案: 错误说明了一切: 您的主要问题是所使用的二进制文件之间的 版本兼容性 ,如下所示: 您正在使用

  • 我突然遇到了硒和铬驱动的错误问题。我还没有改变一件事,但我遇到了这些错误信息。这个脚本在几个小时前就开始工作了,现在没有任何调整,它不工作了。 这是我对应的代码: 更奇怪的是,当打开新终端、加载python并从selenium import webdriver中键入时,我没有收到任何错误。但是,当我导航到脚本所在的文件夹,并从selenium import webdriver加载python和类型

  • 在我开始之前:我知道有10亿篇关于硒不起作用的帖子,还有各种各样的解决方案需要尝试。我相信我什么都试过了,但如果我错过了什么,请原谅。我的头撞到墙上了,非常感谢你的帮助。 以下是我采取的一些措施: 我下载了chromedriver for selenium(Ubuntu,Python),并使用和使驱动程序可执行。之后,我用。 我尝试了各种Selenium选项,包括手动添加chromedriver运

  • 问题内容: 我需要制作一个从用户获取以下内容的脚本: 1)进程名称(在Linux上)。 2)此进程写入的日志文件名。 它需要终止该进程并确认该进程已关闭。将日志文件名更改为带有时间和日期的新文件名。然后再次运行该过程,确认它已启动,以便继续写入日志文件。 先谢谢您的帮助。 问题答案: 您可以使用以下命令检索给定名称的进程ID(PID): 希望这可以帮助

  • 我正在使用Selenium编写一些代码,有一次我提出了7个请求,所有请求都指向不同的网站。对于第一个,这很好。但是,对于其他人,我得到一个会话ID错误。我认为我的浏览器配置正确,因为我确实从第一个网站获得了结果。我试着在两个请求之间放置一个WebDriverWait,但没有效果。我想这些网站可能会阻止我的请求。有人知道如何解决这个问题吗? 我很抱歉,如果这是愚蠢的事情,或者如果我做错了什么,我是新