Python+Selenium从CSV读取站点,如何强制10秒切换下一个?
问题分析
你的代码存在两个核心问题:
- 时间判断逻辑无效:
driver.get()执行后立刻判断时间差,此时时间差几乎为0,永远不会触发超时逻辑;而且break会直接跳出整个站点循环,不是切换到下一个站点。 - 页面冻结导致阻塞:当w3schools这类站点加载卡住时,
driver.get()会一直阻塞主线程,根本无法进入后续的时间判断步骤。
解决方案
1. 设置页面加载超时
先给WebDriver设置页面加载超时,避免driver.get()无限阻塞:
driver.set_page_load_timeout(10)
这样如果页面10秒内没加载完成,会抛出TimeoutException,我们可以捕获这个异常并直接切换到下一个站点。
2. 线程+超时控制处理单站点
如果你的站点操作(点击等)需要在加载完成后执行,同时要限制整个操作流程不超过10秒,可以用线程+超时控制的方式:把站点的操作逻辑放在子线程,主线程等待10秒,超时就强制终止子线程并切换。
完整修改代码
import time import csv import threading from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from selenium.common.exceptions import ( NoSuchElementException, ElementNotInteractableException, TimeoutException ) from webdriver_manager.chrome import ChromeDriverManager # 安装指定版本的ChromeDriver driver_path = ChromeDriverManager(driver_version="125.0.6422.77").install() def process_site(driver, website): """处理单个站点的操作逻辑(包含你省略的点击操作)""" try: driver.get(website) # 这里添加你省略的点击操作代码 # 示例:driver.find_element(By.XPATH, "//button[@id='target-btn']").click() except (NoSuchElementException, ElementNotInteractableException) as e: print(f"操作元素失败 {website}: {e}") if __name__ == "__main__": # Selenium配置 chrome_options = Options() chrome_options.add_argument("--start-fullscreen") # 全屏打开浏览器 # 可选:禁用图片加载加快速度 # chrome_options.add_argument("--blink-settings=imagesEnabled=false") driver = webdriver.Chrome(service=Service(driver_path), options=chrome_options) # 设置页面加载超时10秒 driver.set_page_load_timeout(10) # 读取CSV站点列表 with open('websites2.csv', newline='') as csvfile: reader = csv.DictReader(csvfile) for row in reader: website = row['website'] print(f"正在处理站点: {website}") try: # 子线程处理站点操作 site_thread = threading.Thread(target=process_site, args=(driver, website)) site_thread.start() # 主线程等待10秒,超时则进入下一个站点 site_thread.join(timeout=10) # 如果10秒后线程仍在运行,说明超时或页面冻结 if site_thread.is_alive(): print(f"站点 {website} 超时/冻结,切换至下一个") # 打开空白页重置Driver状态 driver.get("about:blank") except TimeoutException: print(f"站点 {website} 加载超时,切换至下一个") driver.get("about:blank") except Exception as e: print(f"处理 {website} 出错: {e}") driver.get("about:blank") # 关闭浏览器 driver.quit()
关键改进点
- 页面加载超时:避免
driver.get()因站点冻结无限阻塞主线程。 - 线程超时控制:即使页面卡住,主线程也能在10秒后强制切换,通过打开空白页重置Driver状态,确保后续站点不受影响。
- 状态重置:每次处理完站点(或出错后)都重置Driver,避免异常状态传递到下一个站点。
内容的提问来源于stack exchange,提问作者claudiopb
相关产品推荐
相关产品推荐

