为何Selenium的driver.get()会无规律卡顿且超时设置无效?
driver.get() 无规律卡顿的排查方向与解决建议
以下是几种常见的原因及对应的解决办法:
- 页面加载策略导致资源阻塞
默认页面加载策略为normal,会等待所有资源(图片、第三方广告/统计脚本等)加载完成才结束driver.get()。如果页面存在加载缓慢的第三方资源,会导致driver.get()长时间卡住,甚至绕过set_page_load_timeout的限制(因为浏览器仍处于“加载中”状态)。
解决:修改加载策略为eager(DOM加载完成即返回)或none(直接返回,不等待加载):
from selenium.webdriver.chrome.options import Options options = Options() options.page_load_strategy = 'eager' # 或 'none' driver = webdriver.Chrome(options=options)
- 超时设置未正确生效或未处理
set_page_load_timeout()依赖浏览器的加载状态判断,若页面存在无限轮询的JS脚本,可能不会触发超时。另外,当前捕获的WebDriverException范围太广,建议单独处理TimeoutException,并强制终止页面加载:
from selenium.common.exceptions import TimeoutException def get_bs4_element(url): try: driver.get(url) html = driver.page_source return BeautifulSoup(html, 'lxml') except TimeoutException as e: print(f"页面加载超时: {url}, 错误: {str(e)}") driver.execute_script("window.stop();") # 强制停止加载 return BeautifulSoup(driver.page_source, 'lxml') except WebDriverException as e: print(f"Selenium异常: {url}, 错误: {str(e)}")
- 复用Driver导致的会话残留问题
循环复用同一个Driver时,之前页面的缓存、Cookie、JS上下文可能占用资源,导致后续请求卡顿。
解决:每次请求后清理缓存,或超时后重启Driver:
# 每次请求后清理 driver.delete_all_cookies() driver.execute_script("window.localStorage.clear();") driver.execute_script("window.sessionStorage.clear();") # 超时后重启Driver的函数 def restart_driver(): global driver driver.quit() options = Options() options.page_load_strategy = 'eager' driver = webdriver.Chrome(options=options) driver.set_page_load_timeout(60) # 在超时异常中调用 except TimeoutException as e: print(f"超时,重启Driver: {url}") restart_driver() return None
- 目标网站反爬机制
部分网站会检测自动化请求,通过延迟加载、阻塞资源限制爬虫,导致无规律卡顿。
解决:添加真实User-Agent、设置随机请求间隔:
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36") # 循环中添加随机延迟 import time import random time.sleep(random.uniform(1, 3))
- 版本兼容性问题
确认ChromeDriver版本与Chrome完全匹配(比如Chrome 115.0.5790.171对应ChromeDriver也需为115.0.5790.171),即使大版本一致,小版本不匹配也可能导致异常。
内容的提问来源于stack exchange,提问作者luke
相关产品推荐
相关产品推荐

