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

Python中Selenium无法关闭全部Edge浏览器实例问题求助

Selenium浏览器实例残留导致/tmp磁盘占满问题解答

问题场景

每日使用Python的Selenium爬取大量网页时,发现Linux系统/tmp目录中残留Edge浏览器实例文件夹,最终占满磁盘空间。残留文件夹示例:

/tmp/.com.microsoft.Edge.BX4XtO/

使用的核心代码如下:

import time
import logging
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

def scrape_page(web_address):
    try:
        edge_options = webdriver.EdgeOptions()
        edge_options.use_chromium = True
        edge_options.add_argument('--remote-debugging-port=0')
        edge_options.add_argument('--no-first-run')
        edge_options.add_argument('--no-default-browser-check')
        edge_options.add_argument('--headless=new')
        edge_options.add_argument('--log-level=3')
        edge_options.add_argument("--disable-logging")
        edge_options.add_argument('--start-maximized') 
        edge_options.add_argument('--disable-infobars') 
        edge_options.add_experimental_option('excludeSwitches', ['disable-popup-blocking'])
          
        # 创建驱动时生成3个/tmp/.com.microsoft.Edge.xxx文件夹
        driver = webdriver.Edge(options = edge_options)

        driver.get(web_address)
        time.sleep(3)
        response = driver.find_element(By.XPATH, "/html/body").text
    except Exception as e:
        print(e)
        logging.warning('Scraping {0} failed - {1}'.format(web_address, e))
        return
    finally:
        driver.close()
        driver.quit()
    return response

现象确认:

  • 执行driver = webdriver.Edge(options = edge_options)时,/tmp目录生成3个Edge实例文件夹:
    .com.microsoft.Edge.bZsnHM/ .com.microsoft.Edge.tZLIcy/ .com.microsoft.Edge.wPEEWf/
    
  • 执行quit()命令后,仅关闭2个实例,剩余1个:
    .com.microsoft.Edge.bZsnHM/
    
  • 该残留实例为创建时生成的第三个,且Chrome替换Edge后问题完全一致。

疑问解答

1. Selenium是否应该开启3个实例?

不是。Chromium内核浏览器(Edge/Chrome)采用多进程架构,启动时会生成主进程、渲染进程、GPU进程等多个子进程,每个进程对应独立的临时数据目录,也就是你看到的3个/tmp文件夹。这是浏览器自身的设计,而非Selenium主动开启3个独立实例。

2. 为何quit()无法关闭全部Edge实例?

主要有以下几种原因:

  • 进程回收异常:driver.quit()负责终止浏览器会话并清理所有关联进程,但如果某个子进程因资源占用过高、异常挂起等原因未收到终止信号,就会残留进程和对应的临时目录。
  • 无头模式资源泄漏:--headless=new模式下,Chromium的进程管理逻辑存在小概率的资源泄漏问题,导致部分子进程未被正确回收。
  • 异常捕获范围限制:原代码仅捕获requests.exceptions.RequestException,但Selenium操作抛出的异常(如元素定位失败)不在该范围内,不过finally块会强制执行quit(),所以这种情况概率较低,核心还是进程自身的回收问题。

3. 如何清除所有实例?

可以通过以下几种方案解决:

方案一:优化Selenium退出逻辑

去掉冗余的driver.close(),直接使用driver.quit()(quit()会自动关闭所有窗口并终止进程),同时增加异常捕获避免退出失败:

finally:
    try:
        driver.quit()
    except Exception:
        pass

方案二:强制清理Chromium进程

在quit()后,通过系统命令强制杀死残留的Edge/Chrome进程:

import subprocess

def kill_chromium_processes():
    # 杀死Edge进程
    subprocess.run(["pkill", "-f", "msedge"], capture_output=True)
    # 若使用Chrome则执行下方命令
    # subprocess.run(["pkill", "-f", "chrome"], capture_output=True)

# 在finally块中调用
finally:
    try:
        driver.quit()
    except Exception:
        pass
    kill_chromium_processes()

方案三:指定自定义临时目录并手动清理

通过浏览器参数指定独立临时目录,避免占用/tmp,爬取结束后强制删除目录:

import shutil
import tempfile

def scrape_page(web_address):
    temp_dir = tempfile.mkdtemp(prefix="selenium_edge_")
    try:
        edge_options = webdriver.EdgeOptions()
        edge_options.use_chromium = True
        # 指定自定义用户数据目录和缓存目录
        edge_options.add_argument(f'--user-data-dir={temp_dir}')
        edge_options.add_argument(f'--disk-cache-dir={temp_dir}/cache')
        # 其他参数...
        
        driver = webdriver.Edge(options = edge_options)
        # 爬取逻辑...
    finally:
        try:
            driver.quit()
        except Exception:
            pass
        # 强制删除临时目录
        shutil.rmtree(temp_dir, ignore_errors=True)

方案四:系统定时任务自动清理

在Linux上添加cron定时任务,定期清理/tmp下的残留浏览器临时文件夹:

# 每天凌晨2点清理/tmp下的Edge和Chrome临时文件夹
0 2 * * * rm -rf /tmp/.com.microsoft.Edge.* /tmp/.com.google.Chrome.*

内容的提问来源于stack exchange,提问作者Markus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 19:23:28