Chrome WebDriver执行driver.get(URL)时卡顿,脚本无法继续迭代
解决Chrome Driver长期运行后卡在driver.get(URL)的问题
问题场景
使用以下undetected-chromedriver初始化代码,脚本运行一段时间后,新迭代会卡在driver.get(URL)步骤无法继续执行:
options = uc.ChromeOptions() options.add_argument("--excludeSwitches=enable-automation") options.add_argument("--excludeSwitches=enable-logging") prefs = { 'credentials_enable_service': False, 'profile': { 'password_manager_enabled': False } } options.add_experimental_option('prefs', prefs) options.set_capability('unhandledPromptBehavior', 'dismiss') options.add_argument('--disable-extensions') options.add_argument('--disable-gpu') options.add_argument('--no-sandbox') options.add_argument('--disable-notifications') options.add_argument('--disable-popup-blocking') driver = uc.Chrome(options=options) driver.maximize_window() driver.set_page_load_timeout(80) # Set the script timeout to 20 seconds driver.set_script_timeout(30)
可行解决措施
1. 定期重启Driver实例
长期运行的Chrome实例会积累内存泄漏、缓存冗余等问题,直接导致请求阻塞。可以设置固定迭代次数或运行时长,到期后销毁当前driver并重新初始化:
iteration_count = 0 max_iterations_before_restart = 10 # 每10次迭代重启一次 while True: iteration_count += 1 if iteration_count % max_iterations_before_restart == 0: driver.quit() # 重新初始化driver driver = uc.Chrome(options=options) driver.maximize_window() driver.set_page_load_timeout(80) driver.set_script_timeout(30) # 执行业务逻辑 driver.get(URL) # ...后续操作
2. 调整页面加载策略
默认加载策略会等待页面所有资源加载完成,若存在慢加载资源会导致driver.get()阻塞。可以设置为eager(等待DOM加载完成即可)或none(完全不等待,需自行判断页面就绪状态):
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities # 配置加载策略为eager caps = DesiredCapabilities.CHROME.copy() caps["pageLoadStrategy"] = "eager" options.set_capability("pageLoadStrategy", "eager") driver = uc.Chrome(options=options, desired_capabilities=caps)
3. 增加超时异常捕获与恢复
为driver.get()添加超时捕获,发生超时后强制重启driver并重新请求:
from selenium.common.exceptions import TimeoutException try: driver.get(URL) except TimeoutException: # 超时后销毁旧实例并重建 driver.quit() driver = uc.Chrome(options=options) driver.maximize_window() driver.set_page_load_timeout(80) driver.set_script_timeout(30) # 重新发起请求 driver.get(URL)
4. 启用无痕模式并限制缓存
通过无痕模式隔离会话缓存,同时限制磁盘缓存大小,减少长期运行的缓存积累:
options.add_argument("--incognito") # 启用无痕模式 options.add_argument("--disk-cache-size=0") # 禁用磁盘缓存
5. 监控系统资源占用
长期运行的Chrome实例可能耗尽内存或CPU,导致进程卡顿。可以在脚本中监控资源,占用过高时重启driver:
import psutil def check_driver_resource(driver): pid = driver.service.process.pid process = psutil.Process(pid) mem_usage = process.memory_percent() cpu_usage = process.cpu_percent() # 内存占用超80%或CPU占用超90%时触发重启 return mem_usage > 80 or cpu_usage > 90 # 迭代中检查资源状态 if check_driver_resource(driver): driver.quit() driver = uc.Chrome(options=options) driver.maximize_window() driver.set_page_load_timeout(80) driver.set_script_timeout(30)
内容的提问来源于stack exchange,提问作者Mominur Rahman
相关产品推荐
相关产品推荐

