← 返回博客列表

Python取A股数据:不装SDK只用requests的3行写法

2026年08月13日 08:15 · 智兔数服 · 零依赖量化数据实战

摘要:Python 取 A 股数据:不装 SDK,只用 requests 的 3 行写法 智兔数服零依赖系列第 2 篇 | 一个 URL,就是你的数据源 接口: /hs/list/all 、 /hs/history/{code}/{period}

智兔数服零依赖系列第 2 篇 | 一个 URL,就是你的数据源 接口:/hs/list/all/hs/history/{code}/{period}/{dividend}(免费 200 次/日) 上一篇:A01 浏览器地址栏取行情


1. 从 3 行代码开始

上一篇我们在浏览器地址栏里拿到了 A 股全市场 5209 只股票的数据。现在把同样的操作翻译成 Python:

import requests

url = "https://api.zhituapi.com/hs/list/all?token=你的智兔token"
data = requests.get(url, timeout=15).json()
print(f"获取到 {len(data)} 只股票")

运行结果:

获取到 5209 只股票

就这么简单。不装 SDK,不配开发环境,不需要 pip install 任何智兔专属包。 requests 是 Python 生态最通用的 HTTP 库,几乎所有 Python 环境都有。

对比:用 Tushare 取同样的数据,需要 pip install tushare,注册账号,获取积分,调用 ts.pro_api()。多出来的每一步都是潜在卡点。


2. 工程版:20 行带错误处理和重试

3 行代码能跑,但生产环境不能这么写。加上错误处理、超时重试和限频:

import requests
import time

BASE = "https://api.zhituapi.com"
TOKEN = "你的智兔token"

def fetch_with_retry(url, max_retries=3, timeout=15):
    """带重试的 HTTP GET 请求。"""
    for attempt in range(max_retries):
        try:
            r = requests.get(url, timeout=timeout)
            if r.status_code == 200:
                return r.json()
            elif r.status_code == 401:
                print(f"  [限频] 等待 60 秒...")
                time.sleep(60)
            else:
                print(f"  [错误] HTTP {r.status_code}: {r.text[:100]}")
                return None
        except requests.exceptions.Timeout:
            print(f"  [超时] 第 {attempt+1} 次重试...")
            time.sleep(2)
        except Exception as e:
            print(f"  [异常] {e}")
            return None
    return None

用这个函数拉平安银行的历史日 K 线:

url = f"{BASE}/hs/history/000001/d/f?token={TOKEN}"
kline = fetch_with_retry(url)

运行结果:

获取到 8689 根日K线
最近 3 根:
  2026-08-07 开:11.23 收:11.19 高:11.26 低:11.10 量:882977
  2026-08-10 开:11.18 收:11.29 高:11.38 低:11.16 量:889060
  2026-08-11 开:11.31 收:11.28 高:11.40 低:11.24 量:401133

平安银行从 1991 年上市至今,8689 个交易日的完整日 K 线,一个 GET 就拿到了。

路由规则/hs/history/{股票代码}/{周期}/{复权} - 周期:d=日 / w=周 / m=月 / y=年 / 5=5分钟 / 15=15分钟 / 30=30分钟 / 60=60分钟 - 复权:n=不复权 / f=前复权 / b=后复权


3. 落 DataFrame:数据分析第一步

拿到 JSON 之后,第一步通常是转成 pandas.DataFrame

import pandas as pd

df = pd.DataFrame(kline)

# 字段中文映射
field_map = {
    't': '日期', 'o': '开盘', 'c': '收盘',
    'h': '最高', 'l': '最低', 'v': '成交量(手)',
    'a': '成交额(元)', 'pc': '前收盘', 'sf': '停牌标志',
}
df.rename(columns=field_map, inplace=True)

print(f"DataFrame shape: {df.shape}")
print(f"列名: {list(df.columns)}")
print(df.tail(5).to_string(index=False))

运行结果:

DataFrame shape: (8689, 9)
列名: ['成交额(元)', '收盘', '最高', '最低', '开盘', '前收盘', '停牌标志', '日期', '成交量(手)']
              成交额(元)   收盘    最高    最低    开盘   前收盘  停牌标志        日期   成交量(手)
1.703943e+09 11.25 11.50 11.18 11.41 11.44   0 2026-08-05 1511510
1.171012e+09 11.27 11.28 11.12 11.22 11.25   0 2026-08-06 1046343
9.863737e+08 11.19 11.26 11.10 11.23 11.27   0 2026-08-07  882977
1.005591e+09 11.29 11.38 11.16 11.18 11.19   0 2026-08-10  889060
4.541787e+08 11.28 11.40 11.24 11.31 11.29   0 2026-08-11  401133

K 线字段说明

字段 含义 说明
t / 日期 交易日期 YYYY-MM-DD
o / 开盘 开盘价 前复权/后复权后价格
c / 收盘 收盘价 当日最终成交价
h / 最高 最高价 当日最高成交价
l / 最低 最低价 当日最低成交价
v / 成交量 成交量(手) 1 手 = 100 股
a / 成交额 成交额(元) 当日总成交金额
pc / 前收盘 前一交易日收盘价 用于计算涨跌幅
sf / 停牌标志 0=正常 / 1=停牌 停牌日 OHLC 不更新

存 CSV

df.to_csv("平安银行_日K_前复权.csv", index=False, encoding='utf-8-sig')

utf-8-sig 编码,Excel 直接打开不乱码。


4. 批量拉取与限频

实战场景:你要拉 100 只股票的最新行情。免费版限制 300 次/分钟,需要做限频。

import time

stocks = ['000001', '000002', '000006', '000007', '000008']
results = []

for code in stocks:
    url = f"{BASE}/hs/latest/{code}/d/f?token={TOKEN}"
    data = fetch_with_retry(url)
    if data:
        bar = data[0]
        results.append({
            '代码': code, '日期': bar['t'],
            '收盘': bar['c'], '开盘': bar['o'],
            '最高': bar['h'], '最低': bar['l'],
        })
        print(f"  {code}: 收盘={bar['c']} 日期={bar['t']}")
    time.sleep(0.2)  # 免费版 300次/分 -> 每次间隔 0.2s

运行结果:

  000001: 收盘=11.26 日期=2026-08-11
  000002: 收盘=3.23 日期=2026-08-11
  000006: 收盘=6.79 日期=2026-08-11
  000007: 收盘=10.61 日期=2026-08-11
  000008: 收盘=2.44 日期=2026-08-11

5 只股票耗时: 1.26s (含 0.2s/次 间隔)
推算 100 只约需: 25.2s

限频策略对照

证书版本 频率限制 每次间隔 100 只耗时
免费版 300 次/分 0.2s ~25s
体验版 ¥58 1000 次/分 0.06s ~9s
包年版 ¥688 3000 次/分 0.02s ~5s
至尊版 ¥1088 6000 次/分 0.01s ~3s

免费版的 300 次/分对个人研究完全够用。批量拉全市场 5000 只股票,免费版约需 17 分钟;包年版仅需 2 分钟。


5. 错误码处理

智兔 API 的错误码体系很简单,代码里需要处理的就三种:

if r.status_code == 200:
    return r.json()
elif r.status_code == 400:
    # 104:缺少token参数 -> 检查 URL 是否带 token
    pass
elif r.status_code == 401:
    # 频率超限 -> 等一分钟重试
    time.sleep(60)
elif r.status_code == 403:
    # 102:证书不存在 -> token 填错了或已过期
    pass
HTTP 状态码 错误码 含义 处理方式
400 104 缺少 token 参数 URL 加上 ?token=你的token
401 请求频率超限 等 60 秒重试
403 102 证书不存在/已过期 检查 token 是否正确

6. 完整 Demo 脚本

本篇所有代码已归档,可以直接运行:

Demo/2026-08-12/A02-Python-requests取数/
  ├── a02_python_requests_demo.py    # 完整 Demo 脚本
  └── 平安银行_日K_前复权.csv          # 运行后生成的 CSV

运行方式:

pip install requests pandas
python a02_python_requests_demo.py

把脚本里的 TOKEN = "你的智兔token" 替换为你的真实 token 即可。


7. 小结

你在这一篇里学会了:

  1. 3 行最小代码requests.get(url).json() 就能拿到数据
  2. 20 行工程版:错误处理 + 超时重试 + 限频退避
  3. pandas DataFrame:JSON 转 DataFrame + 字段映射 + 存 CSV
  4. 批量拉取:5 只股票 1.26s,100 只约 25s(免费版)
  5. 错误码体系:104 / 102 / 401 三种错误的含义和处理

没有 SDK 反而少了一层黑箱——返回什么字段一目了然,调试时直接看 JSON 就知道问题在哪。


下一篇预告

《Excel/WPS 直接拉股票数据:一个 WEBSERVICE 函数搞定》——连 Python 都不用装,在 Excel 单元格里输入一个函数,数据就拉进来了。这是整个系列里受众最广的一篇。


免费领证www.zhituapi.com → 请求证书 → 证书获取 →免费版(¥0 / 期限不限 / 200 次/日)

本文代码和运行结果均来自 2026-08-11 实测,数据真实可复现。

想亲自试一下?免费获取证书