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

Python Selenium如何跳过WebDriverException实现脚本不中断运行

问题根源

原脚本无法捕获网络类异常、运行意外中断,核心是5处逻辑错误:

  • ERR_NAME_NOT_RESOLVED、ERR_CONNECTION_TIMED_OUT两类网络错误由driver.get(rawUrls)调用触发,该逻辑及后续页面滚动JS执行逻辑完全位于try块外,异常抛出时无捕获逻辑,直接终止脚本运行。
  • 多异常捕获语法无效:except WebDriverException or NoSuchElementException or Exception不符合Python语法规范,多异常捕获需将异常类封装为元组传入,原写法实际仅会匹配第一个判定为真的异常类,后续异常类完全不生效。
  • 每个URL检测都新建Chrome实例,但全程未调用driver.quit()释放进程,运行一段时间后会堆积大量僵尸Chrome进程,占满系统内存触发额外崩溃。
  • 异常处理分支调用driver.current_url获取地址,当网络请求失败时driver处于异常状态,该调用会触发二次异常,直接打断主循环。
  • 冗余逻辑过多:存在重复导入模块、main块创建从未使用的csv.reader对象、错误将logging.exception作为异常实例引用等问题。
修复后完整可运行代码
from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException, WebDriverException, TimeoutException
from fake_useragent import UserAgent
import csv

# 浏览器全局配置仅初始化一次,无需每个URL重复创建
options = Options()
ua = UserAgent()
userAgent = ua.random
options.add_argument(f'user-agent={userAgent}')
options.add_argument("--headless=new")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--disable-gpu")
# 配置页面加载超时,避免无效URL长时间卡死
PAGE_LOAD_TIMEOUT = 15

def csv_url_reader(url_obj):
    reader = csv.DictReader(url_obj, delimiter=',')
    for line in reader:
        raw_url = line["URL"].strip()
        print(f"正在检测: {raw_url}")
        driver = None
        try:
            # 初始化浏览器实例
            driver = webdriver.Chrome(options=options)
            driver.set_window_size(1920, 1080)
            driver.set_page_load_timeout(PAGE_LOAD_TIMEOUT)
            
            # 页面请求、滚动操作全部纳入try块捕获范围
            driver.get(raw_url)
            driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
            sleep(1) # 等待1秒确保页面元素渲染完成

            # 查找目标元素
            name = driver.find_element(By.ID, 'author')
            email = driver.find_element(By.ID, 'email')
            
            print(f"检测通过: {raw_url} 包含所有必填元素")
            with open("HAS_ALL_ELEMENTS.txt", "a", encoding="utf-8") as f:
                f.write(f"{raw_url}\n")

        # 全量异常兜底,覆盖所有可能的报错场景
        except (WebDriverException, NoSuchElementException, TimeoutException, Exception):
            print(f"检测失败: {raw_url} 无法访问或缺少必填元素")
            with open("NO_ELEMENTS.txt", "a", encoding="utf-8") as f:
                f.write(f"{raw_url}\n")
        
        # 无论检测成功/失败,强制关闭浏览器实例释放资源
        finally:
            if driver:
                try:
                    driver.quit()
                except:
                    pass
        continue

if __name__ == "__main__":
    with open("RAW_URLs.csv", "r", encoding="utf-8") as url_obj:
        csv_url_reader(url_obj)
关键改动说明
  • 所有可能抛出异常的逻辑(浏览器初始化、页面请求、JS执行、元素查找)全部纳入try块覆盖范围,DNS解析失败、连接超时等网络类错误会被正常捕获,不会打断主循环。
  • 修正异常捕获语法,覆盖所有已知Selenium异常+通用Exception兜底,任意错误触发时都会自动跳过当前URL,继续处理下一条。
  • 新增finally块强制回收Chrome进程,从根源避免僵尸进程堆积导致的内存泄漏、程序崩溃问题。
  • 异常分支直接使用从CSV读取的原始URL写入日志文件,避免driver状态异常时调用driver.current_url触发二次报错。
  • 新增页面加载超时配置,访问无效URL时不会长时间阻塞,超时后自动跳过。
  • 补充headless模式运行的稳定性参数,降低无界面环境下的浏览器崩溃概率。
  • 所有文件读写增加utf-8编码配置,避免URL含特殊字符时写入报错。
  • 移除手动指定chromedriver路径的逻辑,适配Selenium 4.6+版本的自动驱动管理,无需手动下载匹配对应版本的Chrome驱动。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:33:23