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



我有一个爬行过程,它在一个自定义类中启动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 上运行

提前感谢!

从您的代码试用中可以很明显地看出,您已经调用了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()

请参阅:https://stackoverflow.com/a/49756925

将bash创建为根进程可以实现更好的"僵尸处理"。Python并不意味着作为导致僵尸的顶级进程运行。

最新更新