Python取A股数据:不装SDK只用requests的3行写法
摘要: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. 小结
你在这一篇里学会了:
- 3 行最小代码:
requests.get(url).json()就能拿到数据 - 20 行工程版:错误处理 + 超时重试 + 限频退避
- pandas DataFrame:JSON 转 DataFrame + 字段映射 + 存 CSV
- 批量拉取:5 只股票 1.26s,100 只约 25s(免费版)
- 错误码体系:104 / 102 / 401 三种错误的含义和处理
没有 SDK 反而少了一层黑箱——返回什么字段一目了然,调试时直接看 JSON 就知道问题在哪。
下一篇预告
《Excel/WPS 直接拉股票数据:一个 WEBSERVICE 函数搞定》——连 Python 都不用装,在 Excel 单元格里输入一个函数,数据就拉进来了。这是整个系列里受众最广的一篇。
免费领证:www.zhituapi.com → 请求证书 → 证书获取 →免费版(¥0 / 期限不限 / 200 次/日)
本文代码和运行结果均来自 2026-08-11 实测,数据真实可复现。