使用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
相关产品推荐
相关产品推荐

