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

