系列·贰。上一篇跑通了服务,这篇把 45 个工具按业务域拆开讲,全部配真实输出(2026-09-29 盘后运行)。中间会真实演示两个数据源失效的案例——这比成功案例更有教学价值。
六域地图
| 域 | 工具数 | 干什么 | 数据源 |
|---|---|---|---|
| market | 8 | 实时/ K线/分时/指数/搜股/资金流/北向 | 腾讯、新浪、同花顺 |
| sentiment | 10 | 涨停池/炸板/跌停/昨涨停/打板情绪/龙虎榜/热榜 | 东财 push2ex、同花顺、datacenter |
| fundamental | 6 | 财务指标/三表/F10/EPS 一致预期 | 腾讯衍生、mootdx、同花顺 |
| research | 4 | 个股/行业研报、PDF 下载、互动易、巨潮公告 | 东财 reportapi、巨潮 |
| corporate | 5 | 分红/股东户数/解禁/融资融券/大宗交易 | 东财 datacenter |
| options | 3 | ETF 期权合约/T 型报价/希腊字母+IV | 新浪 |
选型心法:先用 get_a_search 确认代码,再用 market 域拿数据,sentiment 域看情绪,corporate 域排雷(解禁/大宗折价)。
实战一:K 线与指数(market 域)
> get_a_hist(symbol="600519", count=5)
date O H L C V
2026-09-22 1252.15 1265.88 1248.10 1253.80 2457294
2026-09-23 1255.03 1271.50 1250.89 1251.24 3098122
2026-09-24 1250.01 1256.13 1231.05 1237.00 3123935
2026-09-28 1236.00 1244.01 1228.10 1243.88 2821830
2026-09-29 1244.60 1245.87 1230.88 1235.58 2636630
> get_a_indices(indices="sh,sz,cy,hs300")
sh 上证指数 3830.45 +0.18%
sz 深证成指 12901.95 +0.34%
cy 创业板指 3142.56 +0.09%
hs300 沪深300 4345.21 +0.10%
量能配合看得很清楚:茅台 5 天从 1253 跌到 1235,成交量从 312 万手缩到 263 万手——缩量阴跌,不是恐慌盘。K 线源是新浪(scale=240 日线,datalen 最大 1023 根),传 start/end 做区间查询时服务会拉满窗口再本地过滤。
实战二:龙虎榜(sentiment 域)
> get_a_daily_dragon_tiger(trade_date="2026-09-29")
date: 2026-09-29 total: 72
301716 鸿富诚 无价格涨跌幅限制的证券 净买(万) 42004.1 涨幅 653.16% 换手 84.54
002074 国轩高科 日涨幅偏离值达到7%的前5只证券 净买(万) 36838.5 涨幅 10.01% 换手 2.66
000513 丽珠集团 连续三个交易日涨幅偏离值累计达20% 净买(万) 20781.0 涨幅 6.23% 换手 11.17
002172 澳洋健康 日换手率达到20%的前5只证券 净买(万) 20225.4 涨幅 8.28% 换手 29.02
000002 万科A 日涨幅偏离值达到7%的前5只证券 净买(万) 15960.8 涨幅 9.97% 换手 8.26
002912 中新赛克 连续三个交易日涨幅偏离值累计达20% 净买(万) 10551.0 涨幅 10.01% 换手 17.10
打板选手的日常:72 只上榜,get_a_dragon_tiger(symbol=...) 还能下钻到具体个股的买卖前五席位和机构专用席位净额(RPT_BILLBOARD_DAILYDETAILSBUY/SELL 两张表)。这个工具有一次请求聚合 5 张 datacenter 表,是全服务最重的查询之一。
实战三:两个数据源失效的完整排查(真实记录)
这次实跑遇到了两个失败,值得完整记录。
失败 1:涨停池返回空。
> get_a_limit_up_pool(date="20260929")
[] ← 当天明明万科A都涨停了
> get_a_limit_up_pool(date="20260925")
[] ← 换交易日还是空
涨停池走的是东财 push2ex.eastmoney.com 的 getTopicZTPool。指数有数据、datacenter 有数据,唯独这个域名全空——基本可判定是 push2ex 接口变更或对本网络不可达,而不是"今天没有涨停"。这里暴露一个设计陷阱:接口失效和"真的没数据"返回了同样的 []。全市场截面工具 em_clist_all 有 UniverseDegraded 防护(行数低于阈值直接抛错),但涨停池这类单接口工具还没有——这是已知的改进点(你的 PR 机会)。
失败 2:资金流接口连接被重置。
> get_a_fund_flow_120d(symbol="600519")
WARNING Retrying ... Remote end closed connection without response
(push2his.eastmoney.com/api/qt/stock/fflow/daykline/get)
push2his 的连接被对端直接断开,urllib3 按配置重试 3 次后失败。这类"软失败"平时不显眼,但它说明生产部署时最好在国内服务器跑这个服务(代码注释里写过:通达信 TCP 7709 端口对海外 IP 直接超时)。
经验总结成三条:
- 免费数据源都有脾气,多源冗余比单源可靠重要——这套服务里腾讯/新浪/同花顺/东财互为备份
- 空结果必须区分"没数据"和"坏了",下游(尤其是 Agent)没有能力自己分辨
- 5 分钟 TTL 的本地缓存挡掉了大部分重复请求,历史日期的数据这次 PR 之后直接永久缓存
缓存与限流(看懂这两个机制,排障快一半)
- 限流:所有东财请求走
em_get统一入口。原来全局 1 req/s,已改为 per-host(push2 系放宽到 0.2s),get_a_market_snapshot翻 55 页从 ~70s 降到 ~12s - 缓存:文件缓存 + 原子换名写入,
is_empty_result判定为空的结果不写缓存(否则上游限流时返回的空[]会污染 5 分钟内所有请求)
下一篇进新闻链路:30 条真实新闻跑一遍"采集→SimHash 去重→事件分类"的全流程。