Selenium Python爬虫内存占用过高:驱动与XVFB进程未正常关闭
解决Selenium爬虫残留chromedriver与XVFB进程的问题
我的问题背景
我用Python 2.7结合Selenium开发了一款网页爬虫,功能正常,但每次运行后htop里都会残留无法自动终止的chromedriver和XVFB进程——运行5次函数后,就有5个XVFB进程和7个chromedriver进程。我已经在代码里调用了display.stop()和driver.close(),异常捕获里也加了进程关闭逻辑,但问题还是存在,现在内存占用越来越高,想知道原因和解决办法。
附上我的代码:
from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import Select from bs4 import BeautifulSoup import time import json import traceback from pyvirtualdisplay import Display def scrapeBank(bank, return_dict): try: display = Display(visible=0, size=(800, 600)) display.start() options = webdriver.ChromeOptions() options.add_argument('--no-sandbox') options.add_argument('--disable-extensions') options.add_argument('--headless') options.add_argument('--disable-gpu') driver = webdriver.Chrome(chrome_options=options) [do a bunch of stuff] print('Bank Scrape completed') display.stop() driver.close() return_dict['transactions'] = transactions except: display.stop() driver.close() print(traceback.format_exc())
问题原因分析
我帮你排查了下,主要有这几个核心问题:
driver.close()的局限性:你用的driver.close()仅关闭当前浏览器窗口,但不会彻底终止chromedriver进程。只有driver.quit()才会结束整个浏览器会话,彻底杀掉对应的chromedriver进程。如果你的爬虫过程中打开了多个窗口,close()只会关闭当前窗口,剩余的进程就会残留。- 异常处理的变量风险:如果在
display.start()或者driver = webdriver.Chrome(...)这两步就抛出异常,display或driver变量根本没被初始化,此时在except块里调用display.stop()或driver.close()会触发新的异常,导致原本的清理逻辑完全没执行,进程自然残留。 - XVFB进程的清理漏洞:有时候
display.stop()会因为Chrome进程未完全退出而无法彻底杀掉XVFB进程,形成残留。
修复后的代码方案
我给你调整了代码,针对性解决这些问题:
from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import Select from bs4 import BeautifulSoup import time import json import traceback from pyvirtualdisplay import Display def scrapeBank(bank, return_dict): # 先初始化变量为None,避免异常时变量未定义 display = None driver = None try: display = Display(visible=0, size=(800, 600)) display.start() options = webdriver.ChromeOptions() options.add_argument('--no-sandbox') options.add_argument('--disable-extensions') options.add_argument('--headless') options.add_argument('--disable-gpu') # 新增参数:强制Chrome以单进程模式运行,减少进程残留概率 options.add_argument('--single-process') driver = webdriver.Chrome(chrome_options=options) # 你的爬虫业务逻辑 [do a bunch of stuff] print('Bank Scrape completed') return_dict['transactions'] = transactions except Exception as e: print(traceback.format_exc()) finally: # 无论成功/失败,都执行清理逻辑 if driver is not None: # 用quit替代close,彻底终止chromedriver进程 driver.quit() if display is not None: display.stop() # 可选:如果还是有XVFB残留,强制终止进程 # display.popen.terminate()
额外优化建议
- 兜底进程清理:如果还是存在少量残留,可以引入
psutil库,在finally块里主动查找并杀掉关联的chromedriver和XVFB进程。 - 升级Python版本:Python 2.7早已停止维护,很多库的兼容性修复都没有了,升级到Python 3.x能避免很多这类底层问题。
- 移除XVFB依赖:你已经启用了Chrome的
--headless参数,在较新的Chrome版本中,无头模式无需XVFB即可运行,直接去掉pyvirtualdisplay的依赖,能彻底避免XVFB进程残留问题。
内容的提问来源于stack exchange,提问作者mcplums
相关产品推荐
相关产品推荐

