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

Python Selenium:多爬虫文件场景下如何关闭所有WebDriver实例?

解决WebDriver进程残留问题的几种方案

这确实是个头疼的问题——既要保证主脚本能准确感知爬虫的失败从而切换版本,又要避免每次尝试后残留大量闲置浏览器进程拖垮系统资源。我整理了几个实用的解决方案,你可以根据自己的情况选择:

方案一:直接通过系统命令清理进程(无需修改爬虫代码)

如果不想改动现有的爬虫文件结构,最直接的方式就是在每次尝试失败后,调用系统命令杀掉所有相关的浏览器和WebDriver进程。不同操作系统的命令不同,你可以封装成一个函数在主脚本里调用:

代码示例

import subprocess
import sys

def kill_webdriver_processes():
    if sys.platform.startswith('win'):
        # Windows系统:杀掉Chrome浏览器和ChromeDriver进程
        subprocess.run(["taskkill", "/F", "/IM", "chrome.exe", "/IM", "chromedriver.exe"], check=False)
        # 如果用Firefox,换成下面的命令
        # subprocess.run(["taskkill", "/F", "/IM", "firefox.exe", "/IM", "geckodriver.exe"], check=False)
    else:
        # Linux/macOS系统:杀掉Chrome相关进程
        subprocess.run(["pkill", "chrome"], check=False)
        subprocess.run(["pkill", "chromedriver"], check=False)
        # Firefox版本
        # subprocess.run(["pkill", "firefox"], check=False)
        # subprocess.run(["pkill", "geckodriver"], check=False)

# 你的主脚本逻辑
attempts = 0
while attempts < 10:
    try:
        try:
            runfile('file1.py')
        except SomeException:
            runfile('file2.py')
        break
    except:
        attempts += 1
        # 每次失败后清理进程
        kill_webdriver_processes()

优缺点

  • ✅ 无需修改现有的file1.py和file2.py,快速见效
  • ❌ 比较粗暴,可能误杀其他正在运行的同类型浏览器进程(如果你自己在用Chrome的话)

方案二:重构代码,由主脚本统一管理WebDriver实例(更优雅)

这个方案需要你稍微调整爬虫文件的结构,但能从根源上解决进程残留问题——把WebDriver的创建和销毁逻辑完全放在主脚本里,爬虫文件只负责具体的爬取逻辑:

步骤1:修改爬虫文件为函数形式

比如file1.py改成这样:

# file1.py
def run_scraper(driver):
    # 原来的爬取逻辑,比如访问页面、判断版本等
    # 如果版本不匹配,直接抛出你定义的SomeException
    if not is_correct_version(driver):
        raise SomeException("版本不匹配,切换到file2")
    # 正常爬取逻辑...

file2.py同理,改成接收driver参数的函数。

步骤2:主脚本统一管理driver

from selenium import webdriver
import file1
import file2

attempts = 0
while attempts < 10:
    driver = None
    try:
        driver = webdriver.Chrome()  # 主脚本创建driver
        try:
            file1.run_scraper(driver)
        except SomeException:
            file2.run_scraper(driver)
        break
    except Exception as e:
        attempts += 1
        print(f"尝试失败,错误:{e}")
    finally:
        # 不管成功还是失败,都确保关闭driver
        if driver:
            driver.quit()

优缺点

  • ✅ 资源管理更精准,不会残留进程
  • ✅ 主脚本完全控制driver生命周期,逻辑更清晰
  • ❌ 需要修改现有爬虫文件的结构,把代码封装成函数

方案三:使用上下文管理器自动关闭WebDriver(更简洁)

基于方案二,你还可以用Python的with语句(上下文管理器)来简化driver的销毁逻辑,WebDriver原生支持上下文管理器,会自动在块结束时调用driver.quit():

from selenium import webdriver
import file1
import file2

attempts = 0
while attempts < 10:
    try:
        with webdriver.Chrome() as driver:  # with块自动管理driver
            try:
                file1.run_scraper(driver)
            except SomeException:
                file2.run_scraper(driver)
        break
    except Exception as e:
        attempts += 1
        print(f"尝试失败,错误:{e}")

这个方案和方案二本质一样,但代码更简洁,不需要手动写finally块。


关键注意点

不管用哪个方案,都要确保爬虫文件里的异常能正常抛出——不要在爬虫文件内部捕获SomeException,这样主脚本才能感知到版本不匹配,进而切换到另一个爬虫文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:58:31