Selenium中如何延长urllib3超时时间以避免120秒读取超时(适配大CSV文件下载)
我太懂你这个烦恼了——明明给Selenium设置了页面加载超时,结果还是被urllib3的120秒读取超时卡脖子,尤其是处理大CSV这种需要服务器慢慢生成的文件时,这个问题特别闹心。咱们先搞清楚为什么set_page_load_timeout()不管用,再给你上具体的解决办法。
问题根源
你设置的set_page_load_timeout(300)是告诉Selenium:“最多等300秒等页面加载完成”,但你遇到的urllib3.exceptions.ReadTimeoutError是ChromeDriver和本地HTTP服务之间的通信超时(就是报错里的localhost那个端口),这个超时是ChromeDriver的默认配置——固定120秒,和Selenium的页面加载超时不是一回事,所以单独改前者没用。
具体解决办法
咱们从两个层面入手,彻底解决这个超时问题:
1. 给ChromeDriver设置更长的网络超时参数
直接给ChromeDriver传递命令行参数,覆盖它默认的120秒读取/连接超时。在你的ChromeOptions里添加这两行:
# 设置读取超时和连接超时为300秒(根据你的需求调整) chrome_options.add_argument("--read-timeout=300") chrome_options.add_argument("--connect-timeout=300")
如果上面的参数不生效,也可以用毫秒级的全局超时参数:
# 300000毫秒 = 300秒 chrome_options.add_argument("--timeout=300000")
2. 配合页面加载策略优化(推荐)
大文件下载场景下,页面可能长时间处于“加载中”状态,Selenium默认的normal页面加载策略会一直等页面完全加载完成,反而容易触发不必要的超时。咱们可以把加载策略改成eager,让Selenium在DOM结构加载完成后就允许你操作元素,不用等所有资源加载完毕:
# 设置页面加载策略为eager chrome_options.set_capability("pageLoadStrategy", "eager")
3. 用显式等待替代固定页面加载超时(可选但更灵活)
如果不需要限制页面加载的总时间,完全可以去掉driver.set_page_load_timeout(300),改用显式等待来确认关键元素加载完成,这样更适配下载场景:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 访问目标页面后,显式等待lblLatest元素出现,最多等300秒 driver.get(target_data['URL']) latest_data = WebDriverWait(driver, 300).until( EC.presence_of_element_located((By.ID, "lblLatest")) ).text
修改后的完整代码示例
把上面的优化点整合到你的代码里,大概是这样:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time, glob, os, zipfile from url_destinations import url_destinations target_data = url_destinations["OTP"] # Selenium Code to Initiate Download chrome_options = webdriver.ChromeOptions() prefs = {"download.default_directory": r"C:\Users\<hidden>\data\downloads"} chrome_options.add_experimental_option("detach", True) chrome_options.add_experimental_option("prefs", prefs) # 新增:设置ChromeDriver网络超时参数 chrome_options.add_argument("--read-timeout=300") chrome_options.add_argument("--connect-timeout=300") # 新增:优化页面加载策略 chrome_options.set_capability("pageLoadStrategy", "eager") driver = webdriver.Chrome(options=chrome_options) # 替换set_page_load_timeout为显式等待 driver.get(target_data['URL']) latest_data = WebDriverWait(driver, 300).until( EC.presence_of_element_located((By.ID, "lblLatest")) ).text for val in target_data["Check Options"]: selected_item = driver.find_element(By.ID,value=val) selected_item.click() # Wait for Download to Complete while len(glob.glob(prefs["download.default_directory"]+"\*.tmp")) > 0: time.sleep(0.5)
额外提醒
如果还是遇到超时,你可以再检查这两点:
- 确认服务器生成CSV的时间确实不超过你设置的超时值(比如300秒),如果服务器需要更久,就把参数值调大
- 你的本地网络是否稳定,有没有其他工具(比如防火墙)干扰了ChromeDriver的本地通信
备注:内容来源于stack exchange,提问作者Michael Koehler

