普通网友 2025-10-04 19:30 采纳率: 98.6%
浏览 0
已采纳

Python如何自动化导出同花顺自选股数据?

如何通过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)及加密参数。

    请求字段示例值说明
    URLhttps://my.10jqka.com.cn/v1/portfolio/stock/list自选股列表接口
    MethodGET请求方式
    AuthorizationBearer eyJhbGciOiJIUzI1NiIs...JWT Token,需登录后获取
    X-Tokenabc123xyz二次校验token,动态生成
    User-AgentMozilla/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 抓取公钥传输过程,实现全自动密码加密提交。

    三、反爬对抗与稳定性增强

    1. 使用代理池轮换IP(如阿里云HTTP代理服务)
    2. 引入 undetected-chromedriver 替代传统 Selenium
    3. 模拟人类操作延迟(random.uniform(1,3)秒间隔)
    4. 注入 window.navigator.webdriver = undefined 等防检测脚本
    5. 定期更新User-Agent池与设备指纹配置
    6. 设置失败重试机制(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
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 10月23日
  • 创建了问题 10月4日