
本文详解如何修复 selenium webdriver 在导出大型 csv 文件时因 http 连接读取超时(默认 120 秒)导致脚本中断的问题,涵盖服务端超时配置、显式等待优化及下载稳定性增强技巧。
本文详解如何修复 selenium webdriver 在导出大型 csv 文件时因 http 连接读取超时(默认 120 秒)导致脚本中断的问题,涵盖服务端超时配置、显式等待优化及下载稳定性增强技巧。
在使用 Selenium 自动化导出大型报表(如 Excel/CSV)时,常见错误 HTTPConnectionPool(host='localhost', port=XXXXX): Read timed out. (read timeout=120) 并非来自 set_page_load_timeout() 设置——该方法仅控制页面加载阶段的等待上限,而真正触发该报错的是 WebDriver 服务(chromedriver)与客户端之间的 HTTP 连接读取超时(默认 120 秒),它独立于 Selenium 的 Python 绑定层超时逻辑。
要根本解决此问题,需从 WebDriver 服务端能力配置 入手。desired_capabilities 中的 timeouts 字段可精确控制底层 HTTP 会话的 pageLoad 和 script 超时(单位:毫秒),覆盖默认的 120 秒限制:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
import time
import os
def run():
print('running')
# 配置 Chrome 选项(推荐启用无头模式以提升稳定性)
chrome_options = Options()
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
# 可选:指定下载路径(需配合后续文件检查)
# download_dir = os.path.abspath("./downloads")
# os.makedirs(download_dir, exist_ok=True)
# chrome_options.add_experimental_option("prefs", {
# "download.default_directory": download_dir,
# "download.prompt_for_download": False,
# "download.directory_upgrade": True,
# "safebrowsing.enabled": False
# })
# 关键:覆盖 WebDriver 服务端超时(核心修复点)
capabilities = DesiredCapabilities.CHROME.copy()
capabilities['timeouts'] = {
'pageLoad': 300000, # 5 分钟页面加载超时
'script': 300000, # 5 分钟脚本执行超时
# 注意:'implicit' 不影响此处报错,无需设置
}
driver = webdriver.Chrome(
options=chrome_options,
desired_capabilities=capabilities
)
driver.set_window_size(1024, 600)
driver.maximize_window()
try:
driver.get("https://www.pjdsafetysupplies.com/Admin/Product/List")
# 使用显式等待替代隐式等待,提高可靠性
wait = WebDriverWait(driver, 300) # 最长等待 5 分钟
# 等待并选择分类下拉框
select_element = wait.until(
lambda d: d.find_element(By.ID, "SearchCategoryId")
)
Select(select_element).select_by_visible_text('Special Offers')
# 点击搜索按钮
search_btn = wait.until(
EC.element_to_be_clickable((By.ID, 'search-products'))
)
search_btn.click()
# 等待导出下拉菜单可点击并展开
dropdown_btn = wait.until(
EC.element_to_be_clickable((By.XPATH, ".//button[@data-toggle='dropdown']"))
)
dropdown_btn.click()
# 显式等待导出按钮出现且可点击(避免 DOM 渲染延迟)
export_btn = wait.until(
EC.element_to_be_clickable((By.XPATH, ".//button[@name='exportexcel-all']"))
)
export_btn.click()
print("Export initiated. Waiting for file generation...")
# 【重要】此处建议添加文件下载完成检测逻辑(见下方说明)
# time.sleep(180) # ❌ 不推荐:硬等待不可靠
except Exception as e:
print("Automation failed:", str(e))
finally:
driver.quit()
run()
⚠️ 关键注意事项:
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
-
DesiredCapabilities的timeouts是解决Read timed out错误的唯一有效方式,set_page_load_timeout()和implicitly_wait()对该错误无效; - 显式等待(
WebDriverWait)应始终用于动态元素交互,避免find_element抛出NoSuchElementException; - 导出操作完成后,强烈建议增加下载完成校验逻辑(例如轮询目标目录是否存在
.csv文件、检查文件大小是否非零),而非依赖固定time.sleep()—— 因网络和服务器负载波动,实际生成时间不可预测; - 生产环境建议启用 Chrome 无头模式(
--headless=new)并禁用沙箱,提升执行稳定性与资源效率; - 若需精确控制下载路径,请通过
chrome_options.add_experimental_option("prefs", {...})配置,并配合os.path.getsize()检查文件完整性。
通过上述配置,WebDriver 服务将允许长达 5 分钟的 HTTP 响应等待,彻底规避因大文件生成耗时引发的连接中断,确保导出流程稳定可靠。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










