参考
批量取数
只有部分端点支持一次传多个代码,而且每个端点拼回来的方式都不一样 —— 有的多一列 symbol,有的把代码拼进列名。传之前先确认它属于哪一种。
三种批量行为
实测下来,传 sh600519,sz000001 会得到三种完全不同的结果:
| 行为 | 表现 | 端点 |
|---|---|---|
| 正常合并(多出代码列,一行一只) | 行数翻倍,且每行带代码列 | quote(多 symbol 列)· technical · profile |
| 前缀列名(宽表,行数不变) | 列数翻倍,列名变成 sh600519_code / sz000001_code |
chip |
| 只取第一个代码 | 忽略后续代码,不报错 | fund · dividend · block-trade · minute · snapshot |
⚠️ 还有一个特例:margin-trade 的端点描述声明支持批量,但实测传两只时返回结构与单只相同 —— 以实测为准。
三种行为各自怎么取
① 正常合并(quote / technical / profile) —— 直接按代码列筛:
rows = resp["data"]
moutai = [r for r in rows if r["code"] == "sh600519"] # technical / profile
# quote 的代码列叫 symbol,不是 code
moutai_q = [r for r in rows if r["symbol"] == "sh600519"]
⚠️ quote 用 symbol,technical / profile 用 code —— 列名不一致。
② 前缀列名(chip) —— 行数不变,列名带代码前缀,取数要拼接列名:
rows = resp["data"]
for r in rows:
code = r.get("sh600519_code") or r.get("sz000001_code")
if code and code != "-":
profit = r.get(f"{code}_chipProfitRate")
⚠️ 这种形态每行一半是 -(因为它把两只票并排放在同一行)—— 别当成缺数据。
③ 只取第一个代码 —— 必须循环调用:
import time, requests
CODES = ["sh600519", "sz000001", "sh601318"]
out = {}
for c in CODES:
r = requests.get("https://api.ashareapi.com/v1/dividend",
params={"code": c}, headers={"Authorization": f"Bearer {KEY}"},
timeout=10).json()
if r.get("ok"):
out[c] = r["data"]
time.sleep(0.25) # ← 降并发,别打满限流
- 加间隔:限流按每分钟调用数算,循环里不加间隔最容易撞 429。
- 判
ok再存:空结果也是ok: true+ 空数组,属正常(见空结果不等于故障)。 - 429 要重试:读
Retry-After头,等待后重试;不要原速重试。
常见误用
- 以为所有端点都能批量 —— 只有部分支持,其余会静默只取第一个代码(丢数据,不报错)。
- 用同一个列名筛所有端点 ——
quote是symbol,technical/profile是code。 - 拿
chip当行数组拼 —— 它是宽表(前缀列名),行数不翻倍、每行一半是-。 - 循环里不加间隔 —— 直接吃 429。
- 把 429 当失败丢弃 —— 它是限流不是故障,等待重试即可。
- 按行数估算成本 —— 计费按请求次数算,一次批量请求就算一次。
最后更新: 2026-10-07
支持情况与返回结构为 2026-10-07 逐端点实测(同一端点分别传单只代码与 sh600519,sz000001,对比行数、列数与列名)。