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

Selenium中如何延长urllib3超时时间以避免120秒读取超时(适配大CSV文件下载)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 14:17:59