You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:15:53