【问题标题】:Unable to kill Chrome process and running out of memory with ChromeDriver and Chrome through Selenium in Python无法通过 Python 中的 Selenium 杀死 Chrome 进程并使用 ChromeDriver 和 Chrome 耗尽内存
【发布时间】:2019-05-05 08:18:23
【问题描述】:

我有一个在自定义类中启动 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 实例。因此,盒子内存不足。我也尝试在 chrome 进程上运行 a kill 命令,但它仍在运行。任何方向都将不胜感激,因为我将把头发拉出来。

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

提前致谢!

【问题讨论】:

    标签: python selenium google-chrome web-scraping selenium-chromedriver


    【解决方案1】:

    从您的代码试验中可以明显看出您调用了 self.driver.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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-22
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多