如何通过Python自动化获取并导出同花顺自选股数据?常见问题包括:同花顺未提供官方API,导致无法直接调用接口获取自选股列表;用户登录状态难以模拟,验证码或加密参数(如token、cookie)更新频繁,使爬虫易失效;部分反爬机制(如IP限制、行为检测)增加采集难度。此外,数据导出格式(如Excel、CSV)的自动化处理与定时任务集成也常因路径错误或编码问题失败。如何稳定模拟客户端行为并持久化登录态,成为实现全自动导出的关键技术瓶颈。
1条回答 默认 最新
高级鱼 2025-10-04 19:30关注一、背景与挑战概述
在量化投资与个人资产监控场景中,自动化获取同花顺自选股数据成为高频需求。然而,同花顺未开放官方API接口,开发者无法通过标准RESTful方式获取用户自选股列表。这迫使技术团队转向逆向工程与模拟客户端行为的策略。
主要技术难点包括:
- 缺乏公开API文档,需依赖抓包分析定位真实数据接口
- 登录流程涉及多层加密(如RSA密码加密、token动态生成)
- 验证码机制(滑块、短信验证)阻碍自动化登录
- Cookie和Token有效期短,登录态难以持久化
- 反爬系统采用IP频率限制、行为指纹检测(如鼠标轨迹、JS执行环境)
- 导出过程中文件路径、编码格式(如GBK vs UTF-8)、定时任务调度异常频发
二、技术实现路径:由浅入深
1. 初级方案:Selenium 模拟浏览器操作
使用 Selenium + ChromeDriver 可以绕过部分前端加密逻辑,直接操控真实浏览器完成登录与数据抓取。
from selenium import webdriver from selenium.webdriver.common.by import By import time options = webdriver.ChromeOptions() options.add_argument("--disable-blink-features=AutomationControlled") options.add_experimental_option("excludeSwitches", ["enable-automation"]) driver = webdriver.Chrome(options=options) driver.get("https://www.10jqka.com.cn/") time.sleep(5) # 手动扫码登录 driver.get("https://my.10jqka.com.cn/portfolio/#/stock") time.sleep(3) stocks = driver.find_elements(By.CSS_SELECTOR, ".stock-item .name") for stock in stocks: print(stock.text)该方法优点是开发成本低,可应对复杂交互;缺点是资源消耗大,难以部署于服务器集群,且易被检测为自动化工具。
2. 中级方案:Requests + 手动逆向分析接口
通过浏览器开发者工具(F12)抓包,定位自选股请求URL,提取关键Header(User-Agent、Referer、Cookie)及加密参数。
请求字段 示例值 说明 URL https://my.10jqka.com.cn/v1/portfolio/stock/list 自选股列表接口 Method GET 请求方式 Authorization Bearer eyJhbGciOiJIUzI1NiIs... JWT Token,需登录后获取 X-Token abc123xyz 二次校验token,动态生成 User-Agent Mozilla/5.0 (Windows NT 10.0; Win64; x64) 防爬基础伪装 此阶段核心在于持久化登录态——可通过保存 Cookie 和 Token 至本地文件或Redis缓存,并设置自动刷新机制。
3. 高级方案:Hook JavaScript 加密函数(PyExecJS + Node.js)
当发现密码提交前被JS加密(如AES、RSA),可使用 PyExecJS 调用本地Node环境执行同花顺加密脚本片段。
// encrypt.js 示例 function encryptPassword(pwd, publicKey) { const rsa = new RSAKey(); rsa.setPublic(publicKey, "10001"); return rsa.encrypt(pwd); }import execjs with open('encrypt.js', 'r', encoding='utf-8') as f: js_code = f.read() ctx = execjs.compile(js_code) encrypted_pwd = ctx.call("encryptPassword", "your_password", "public_key_hex")结合 Fiddler 或 Charles 抓取公钥传输过程,实现全自动密码加密提交。
三、反爬对抗与稳定性增强
- 使用代理池轮换IP(如阿里云HTTP代理服务)
- 引入 undetected-chromedriver 替代传统 Selenium
- 模拟人类操作延迟(random.uniform(1,3)秒间隔)
- 注入 window.navigator.webdriver = undefined 等防检测脚本
- 定期更新User-Agent池与设备指纹配置
- 设置失败重试机制(retrying库)与日志告警
四、数据导出与自动化集成
graph TD A[启动脚本] --> B{是否已登录?} B -- 是 --> C[调用API获取自选股] B -- 否 --> D[执行登录流程] D --> E[保存Token/Cookie] E --> C C --> F[清洗数据] F --> G[导出CSV/Excel] G --> H[触发定时任务cron] H --> I[邮件推送或数据库入库]导出模块建议采用 pandas 统一处理:
import pandas as pd df = pd.DataFrame(stocks_data, columns=["代码", "名称", "现价", "涨跌幅"]) df.to_csv("zixuangu.csv", index=False, encoding="utf_8_sig") # 解决Excel乱码 # 或导出Excel df.to_excel("zixuangu.xlsx", index=False)配合 Linux crontab 实现每日9:15自动执行:
0 9 * * 1-5 /usr/bin/python3 /path/to/fetch_stocks.py本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报