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

使用Selenium从NSE网站下载盘前市场文件时遇到下载失败问题

使用Selenium从NSE网站下载盘前市场文件时遇到下载失败问题

看起来你遇到的问题是NSE页面切换“All”选项后,数据还没完全加载就点击了下载按钮,或者页面的动态交互逻辑导致下载没能正常触发。我之前处理过类似的场景,给你几个实用的调整方案:

1. 替换固定睡眠为显式等待,确保数据加载完成

NSE的盘前页面切换分类后,需要后台加载并渲染新的表格数据,固定的time.sleep(10)有时候并不够(比如网络慢的时候),改用Selenium的显式等待可以精准等待元素状态变化,避免提前点击下载。

2. 确保下载按钮可交互

有时候下载按钮会处于页面视口外,直接点击会触发“元素不可交互”的错误,需要先滚动到按钮可见位置再点击。

3. 配置Chrome下载设置,控制文件保存路径与命名

通过ChromeOptions可以指定下载目录、禁用下载弹窗,还能在下载完成后重命名文件,完全控制下载文件的去向。

完整调整后的代码示例

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select, WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import os
import time

# 配置Chrome下载参数,指定保存路径
download_directory = "/Users/yourname/Downloads/NSE_PreOpen"  # 替换为你的目标文件夹
os.makedirs(download_directory, exist_ok=True)  # 文件夹不存在则创建

chrome_options = webdriver.ChromeOptions()
prefs = {
    "download.default_directory": download_directory,
    "download.prompt_for_download": False,  # 禁用下载弹窗
    "download.directory_upgrade": True,
    "safebrowsing.enabled": True  # 安全浏览启用,避免被拦截
}
chrome_options.add_experimental_option("prefs", prefs)

# 初始化浏览器并访问页面
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://www.nseindia.com/market-data/pre-open-market-cm-and-emerge-market')
driver.maximize_window()  # 最大化窗口,减少元素不可见概率

try:
    # 等待下拉菜单加载完成,选择"All"分类
    wait = WebDriverWait(driver, 20)
    category_dropdown = wait.until(EC.presence_of_element_located((By.ID, 'sel-Pre-Open-Market')))
    select = Select(category_dropdown)
    select.select_by_visible_text('All')

    # 等待表格数据加载完成(等待表格首行出现)
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#preOpenMarketTable tbody tr')))

    # 找到下载按钮,滚动到可见位置后点击
    download_button = wait.until(EC.element_to_be_clickable((By.ID, 'downloadPreopen')))
    driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", download_button)
    download_button.click()

    # 等待下载完成,处理临时下载文件
    def wait_for_download_completion(folder_path):
        while True:
            # 检查是否有正在下载的临时文件(带.crdownload后缀)
            temp_files = [f for f in os.listdir(folder_path) if f.endswith('.crdownload')]
            if not temp_files:
                # 查找已完成的CSV文件
                csv_files = [f for f in os.listdir(folder_path) if f.endswith('.csv')]
                if csv_files:
                    return csv_files[0]
            time.sleep(1)

    # 获取下载完成的文件名并重命名
    downloaded_file = wait_for_download_completion(download_directory)
    new_file_name = f"NSE_PreOpen_All_{time.strftime('%Y%m%d')}.csv"  # 按日期命名
    os.rename(
        os.path.join(download_directory, downloaded_file),
        os.path.join(download_directory, new_file_name)
    )

    print(f"文件已成功下载并保存为:{os.path.join(download_directory, new_file_name)}")

finally:
    driver.quit()  # 无论成功失败,最后关闭浏览器

关键调整说明

  • 显式等待:用WebDriverWait替代固定睡眠,确保元素加载完成后再操作,避免因网络延迟导致的错误。
  • 滚动到元素:通过execute_script滚动下载按钮到视口中央,解决元素不可交互的问题。
  • 下载控制:配置download.default_directory指定保存路径,通过检查文件后缀判断下载完成,最后重命名文件方便管理。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 10:24:34