Python自动化:构建通达信数据定时抓取与本地化存储系统

📅 2026/6/28 21:12:16
Python自动化:构建通达信数据定时抓取与本地化存储系统
1. 为什么需要自动化抓取通达信数据做量化分析的朋友都知道数据就是我们的生命线。以前我每天下午收盘后都要手动打开通达信软件一个个点击菜单下载收盘数据和财务数据。这种重复劳动不仅浪费时间还经常因为手抖点错位置导致下载失败。最痛苦的是出差或者休假的时候还得找人帮忙操作实在是不方便。后来我发现用Python实现自动化操作简直太香了。只需要写一次脚本设置好定时任务电脑就会在指定时间自动完成所有操作。即使人不在电脑前数据也能准时下载保存。这样既保证了数据的及时性又解放了双手可以把更多时间用在数据分析上。这个自动化系统特别适合以下几类人量化交易初学者需要稳定获取历史数据做回测个人投资者想建立自己的股票数据库金融相关专业学生需要大量数据做研究分析任何厌倦了重复点击操作的程序员朋友2. 系统架构设计2.1 整体工作流程我们的自动化系统主要包含四个核心模块启动模块负责自动启动通达信软件操作模块模拟鼠标点击完成数据下载存储模块将下载的数据整理保存到指定位置调度模块通过任务计划实现定时执行整个系统的运行流程是这样的每天收盘后比如下午3:30系统自动启动先打开通达信软件并登录依次点击菜单下载收盘数据再切换到财务数据页面下载财务数据所有数据下载完成后自动关闭软件最后将数据按日期分类存储到数据库或CSV文件2.2 关键技术选型实现这个系统主要用到以下几个Python库pyautogui用于模拟鼠标移动和点击操作subprocess启动外部程序通达信pandas数据处理和存储schedule定时任务调度可选方案对于屏幕分辨率的适配我们采用字典存储不同分辨率下的点击坐标。目前支持三种常见分辨率1440×9001920×10801366×7683. 详细实现步骤3.1 环境准备与安装首先需要安装必要的Python库pip install pyautogui pandas schedule通达信软件可以从官网下载免费版安装时建议选择默认路径这样后面代码配置会更简单。如果安装在其他路径需要修改代码中的软件路径。3.2 核心代码解析下面是自动下载收盘数据的关键代码import subprocess import pyautogui from time import sleep # 设置操作间隔和安全措施 pyautogui.PAUSE 1 pyautogui.FAILSAFE True # 获取当前屏幕分辨率 screen_size f{pyautogui.size().width}*{pyautogui.size().height} print(f检测到屏幕分辨率: {screen_size}) # 定义不同分辨率下的点击坐标 click_positions { 1440*900: { 免费确认: (858, 488), 系统菜单: (38, 10), 盘后数据: (90, 260), # 其他坐标... }, 1920*1080: { 免费确认: (1100, 568), 系统菜单: (38, 10), 盘后数据: (90, 242), # 其他坐标... }, 1366*768: { 免费确认: (820, 420), 系统菜单: (38, 10), 盘后数据: (85, 240), # 其他坐标... } } # 启动通达信 try: subprocess.Popen(rC:\new_tdx\TdxW.exe) # 修改为你的安装路径 except Exception as e: print(f启动通达信失败: {e}) exit() sleep(5) # 等待软件启动 # 开始自动操作 try: # 点击免费确认 pyautogui.click(click_positions[screen_size][免费确认]) sleep(1) # 进入系统菜单 pyautogui.click(click_positions[screen_size][系统菜单]) sleep(0.5) # 选择盘后数据下载 pyautogui.click(click_positions[screen_size][盘后数据]) sleep(0.5) # 后续操作... except Exception as e: print(f自动操作出错: {e})3.3 财务数据下载实现财务数据的下载流程与收盘数据类似但需要注意几个关键点财务数据下载通常需要更多时间等待间隔要适当延长有些数据包需要额外确认要增加相应的点击操作财务数据量较大建议分批下载# 下载财务数据 pyautogui.click(click_positions[screen_size][系统菜单]) sleep(0.5) pyautogui.click(click_positions[screen_size][专业数据]) sleep(8) # 需要较长时间加载 # 等待下载按钮可用 while True: if not pyautogui.pixelMatchesColor(x, y, (128,128,128)): break sleep(3) pyautogui.click(click_positions[screen_size][财务数据包]) sleep(0.5)4. 数据存储与管理4.1 本地文件存储方案最简单的存储方式是将数据保存为CSV文件。我们可以按日期创建文件夹方便后续查询import os from datetime import datetime # 创建存储目录 today datetime.now().strftime(%Y%m%d) data_dir fD:/tdx_data/{today} os.makedirs(data_dir, exist_okTrue) # 假设已经获取到数据df df.to_csv(f{data_dir}/close_price.csv, indexFalse) df.to_csv(f{data_dir}/financial.csv, indexFalse)4.2 数据库存储方案对于更专业的需求建议使用SQLite或MySQL数据库import sqlite3 from sqlalchemy import create_engine # SQLite方案 conn sqlite3.connect(tdx_data.db) df.to_sql(close_price, conn, if_existsappend, indexFalse) # MySQL方案 engine create_engine(mysqlpymysql://user:passwordlocalhost/tdx_data) df.to_sql(financial_data, engine, if_existsappend, indexFalse)4.3 数据清洗与整理下载的原始数据通常需要做一些处理统一日期格式处理缺失值标准化字段名称类型转换def clean_data(df): # 统一日期格式 df[trade_date] pd.to_datetime(df[trade_date]) # 处理缺失值 df.fillna(methodffill, inplaceTrue) # 标准化列名 df.columns df.columns.str.lower() # 类型转换 df[volume] df[volume].astype(int) return df5. 异常处理与日志记录5.1 常见问题及解决方案在实际运行中可能会遇到这些问题通达信启动失败检查安装路径是否正确点击位置偏移确认屏幕分辨率是否匹配下载超时适当增加等待时间数据不完整添加校验逻辑5.2 完善的日志系统好的日志能帮助我们快速定位问题import logging logging.basicConfig( filenametdx_auto.log, levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s ) try: # 业务代码... logging.info(开始下载收盘数据) except Exception as e: logging.error(f下载失败: {e}, exc_infoTrue)日志应该记录这些关键信息操作开始和结束时间下载的数据类型遇到的错误详情系统状态变化6. 定时任务设置6.1 Windows任务计划程序最稳定的定时方案是使用Windows自带的任务计划打开任务计划程序创建基本任务设置触发器为每天时间15:30操作为启动程序选择Python解释器参数填写脚本路径6.2 Python定时方案如果不想用系统任务也可以用Python实现import schedule import time def job(): print(开始执行下载任务...) # 调用下载函 # 每天15:30执行 schedule.every().day.at(15:30).do(job) while True: schedule.run_pending() time.sleep(60)不过这种方案需要脚本一直运行不如系统任务稳定。7. 系统优化建议7.1 性能优化技巧减少不必要的等待精确控制sleep时间并行下载多线程下载不同数据增量更新只下载新数据错误重试对失败操作自动重试7.2 扩展功能思路这个基础系统可以进一步扩展邮件通知下载完成后发送结果报告自动备份定期压缩归档历史数据数据校验检查数据完整性可视化监控展示数据更新状态# 邮件通知示例 import smtplib from email.mime.text import MIMEText def send_email(subject, content): msg MIMEText(content) msg[Subject] subject msg[From] senderexample.com msg[To] receiverexample.com with smtplib.SMTP(smtp.example.com) as server: server.login(user, password) server.send_message(msg)8. 实际使用经验分享在开发这个系统的过程中我踩过不少坑。最开始没有考虑屏幕分辨率的差异导致在笔记本上写的脚本放到台式机上完全点不准位置。后来改用分辨率自适应的方案才解决这个问题。另一个常见问题是通达信软件更新后界面变化导致点击坐标失效。我的解决办法是定期检查脚本是否还能正常工作并在代码中预留足够的容错空间。数据存储方面最初我直接覆盖旧文件后来发现这样无法追溯历史变化。现在改为按日期存储并保留至少一年的数据备份。对于特别重要的数据还会上传到云存储做双重备份。