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

Python+Selenium从CSV读取站点,如何强制10秒切换下一个?

问题分析

你的代码存在两个核心问题:

  1. 时间判断逻辑无效:driver.get()执行后立刻判断时间差,此时时间差几乎为0,永远不会触发超时逻辑;而且break会直接跳出整个站点循环,不是切换到下一个站点。
  2. 页面冻结导致阻塞:当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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 02:05:56