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
相关产品推荐
相关产品推荐

