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

时间:2018-12-04 00:18:09

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

我有一个自定义类中的硒开始爬行过程:

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进程上运行kill命令,但它保持运行状态。任何方向都将不胜感激,因为我要把头发拉出来。

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

谢谢!

1 个答案:

答案 0 :(得分:1)

从您的代码试用中可以很明显地看出您已经调用了本应该很完美的 self.driver.quit()

由于僵尸 chrome处理,由于该框仍在运行内存不足,因此您采用了正确的方法来执行 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()