Rockyzsu/stock / 数据源
数据从哪来:14 个数据源、四类登录态与 Tushare 三路对照
这个仓库最有价值的部分其实是取数层——它把 A 股散户能用到的公开数据源几乎都对接了一遍:集思录(可转债)、宁稳网(可转债)、巨潮(公告)、东方财富(涨停/强势/炸板/跌停池)、同花顺(行业与资金流)、雪球(组合与私募)、上交所(开户数与 LOF 规模)、金融界(龙虎榜)、和讯(汇率)……
但每一类的「怎么登」都不一样:集思录要用 JS 加密用户名密码再 POST,宁稳网要过验证码,有的站点只需要拷 cookie,Tushare 则需要token。本站把源码里出现的每个数据源、每个端点、每类凭证都列了出来——这是官方 README 完全没有覆盖的部分。
数据源清单
14 类数据源:取什么、从哪取、要不要登录
| 数据源 | 取什么 | 源码位置 | 端点(源码中的真实 URL) | 登录态要求 |
|---|---|---|---|---|
| 集思录 jisilu.cn | 可转债列表、待发列表、公告、QDII | datahub/jisilu.py、jisilu_bond_announcement.py、datahub/ninwen.py 之外的转债脚本 | /data/cbnew/cb_list/、/data/cbnew/cb_list_new/、/data/cbnew/pre_list/、/data/cbnew/announcement_list/、/data/qdii/qdii_list/ | 账号密码(客户端 JS 加密) |
| 宁稳网 ninwin.cn | 可转债全量数据 | datahub/ninwen.py | /index.php?m=u&c=login、?m=cb&a=cb_all、?m=verify&a=get | 账号 + 验证码识别 |
| 巨潮资讯 cninfo.com.cn | 上市公司公告(含 PDF 下载) | datahub/jucao_announcement.py | /new/hisAnnouncement/query、static.cninfo.com.cn | 无(公开接口,需处理分页) |
| 东方财富 push2ex | 涨停池、强势池、炸板池、跌停池、昨日涨停池 | datahub/dfcf_hot_block.py、datahub/zdt.py | /getTopicZTPool、/getTopicQSPool、/getTopicZBPool、/getTopicDTPool、/getYesterdayZTPool | 无,但需先取 ut 参数 |
| 东方财富 dcfm | 机构调研、限售解禁 | datahub/public_private_fund_members.py 等 | dcfm.eastmoney.com/em_mutisvcexpandinterface/api/js/get | 无(带 token 查询参数) |
| 同花顺 10jqka | 行业分类、行业资金流、板块明细 | datahub/industry_info/thshy_*.py(三个脚本) | q.10jqka.com.cn/thshy/、data.10jqka.com.cn/funds/hyzjl/ | cookie + 缺失模块依赖 |
| 同花顺客户端 | 本地客户端行情接口 | datahub/industry_info/ 相关脚本 | http://127.0.0.1:7000/ths/hexin | 需本机安装并运行同花顺客户端 |
| 雪球 xueqiu.com | 组合持仓、策略、收藏、私募、蛋卷基金 | fund/xueqiu_private_fund.py、datahub/xueqiu_group.py、datahub/xueqiu_sync_portfolio.py | /snowman/login、/cubes/rebalancing/create.json、/v5/stock/quote.json、/strategy/ | cookie(xc_token_pro 相关配置) |
| 上交所 sse.com.cn | 开户数、LOF 份额规模 | market/securities_account_opening.py、fund/fund_share_update.py | query.sse.com.cn/commonQuery.do + sqlId=COMMON_SSE_TZZ_M_ALL_ACCT_C / COMMON_SSE_FUND_LOF_SCALE_CX_S | 无(JSONP 形式) |
| 深交所 | 场内基金份额 | fund/fund_share_monitor.py | 深交所基金份额查询接口 | 无 |
| 金融界 jrj.com.cn | 涨停数据、龙虎榜明细 | datahub/zdt.py、longhuban.py | home.flashdata2.jrj.com.cn/limitStatistic/ztForce/、stock.jrj.com.cn/action/lhb/... | 无 |
| 和讯 hexun | 美元兑人民币汇率 | datahub/foreignexchange.py | data.bank.hexun.com/other/cms/foreignexchangejson.ashx | 无(JSONP 形式) |
| 聚币 jubi.com | 山寨币行情(已停更) | jubi.py | /api/v1/ticker、/depth、/orders、/trade_list | 无;脚本自述「python2 代码,网站已停止更新」 |
| 港股打新(aastocks / lianghuaipo) | 港股 IPO 列表与暗盘 | hk_stock/aastock_new_stock.py、hk_stock/new_stock_release.py | aastocks.com/sc/stocks/market/ipo/listedipo.aspx、api2.lianghuaipo.com/hk_ipo/get_paged_listed_stock_list | 无(aastocks 侧用 selenium) |
| ARK / 天天基金 / 蛋卷 | ETF 持仓、新发基金、基金净值 | fund/ark_funds.py、fund/ttjj.py、fund/danjuan_fund.py | 各站接口;ARK 数据落 MongoDB | 天天基金与蛋卷需 execjs 处理参数 |
接口可用性边界:上表是源码里出现过的端点,不是「今天仍然可用」的承诺。这些站点多数会改版、加反爬或调整权限,本站没有在 2026-10-09 逐条请求验证过,使用前请以各站当前规则为准。清理规律是一样的:先能在浏览器里正常访问,再把 cookie / token 搬进配置。
登录态
四类登录态怎么实现:两类当前是断的
| 登录态类型 | 代表站点 | 实现方式 | 凭证存放位置 | 失败时的典型现象 |
|---|---|---|---|---|
| 用户名 + 密码,客户端 JS 加密 | 集思录 | datahub/jsl_login.py 用 execjs 执行 js_file/encode_jsl.js,调用 jslencode(text, key) 加密后再 POST | config.json 的 jsl_monitor.JSL_USER / JSL_PASSWORD | 登录返回 errno != 1,脚本主动 raise ValueError('登录失败') |
| 用户名 + 密码 + 验证码 | 宁稳网 | datahub/ninwen.py 先取 csrf_token,再下载验证码图片,调用外部 OCR 接口识别 | 验证码识别服务的账号/签名/URL 写在 datahub/validate_key.py(内容为空字符串) | 因 validate_key.url 为空,OCR 请求会失败 |
| 纯 cookie | 同花顺行业、部分雪球接口 | configure/util.py 的 read_web_headers_cookies() 从 web_headers.json 读取 | 期望文件 configure/web_headers.json(仓库中不存在) | FileNotFoundError;另该函数还有赋值 bug,cookies 永远返回 None |
| Token | Tushare(官方与第三方两条) | 官方用 ts.set_token(ts_token);第三方用 xc.set_token(xc_token_pro) + xc.pro_api(env='prd', server=xc_server) | config.json 的 ts_token / xc_token_pro / xc_server | 无 token 时接口直接报权限或参数错误 |
| 券商客户端本地会话 | easytrader / PTrade | trader/auto_trader.py 用 easytrader.use('gj_client') 后 prepare('user.json') | user.json(被 .gitignore 排除) | 文件不存在时 prepare() 报错 |
| 本机客户端 HTTP 接口 | 同花顺客户端 | http://127.0.0.1:7000/ths/hexin | 无凭证,但要本机进程在跑 | 连接被拒绝 |
四类登录态里,两类当前是断的:宁稳网的验证码 OCR 依赖向作者索取的账号(validate_key.py 里三个字段都是空字符串);同花顺/雪球所依赖的 configure/web_headers.json 在仓库中不存在。这两条都要自己补,不是配置填错的问题。
老接口 vs 新接口
Tushare 老接口与新接口的区别:不是改名,是换模型
| 老接口(仓库大量使用) | 出现的文件 | 新接口对应写法 | 迁移时的注意点 |
|---|---|---|---|
ts.get_k_data() | select_stock.py、new_stock_break.py、StockAnalyze.py、store_data.py | pro.daily() / pro.daily_basic() | 参数名与返回字段都不同:老接口带 code,新接口用 ts_code;复权参数也要重写 |
ts.get_stock_basics() | select_stock.py、k_line.py、new_stock_break.py、stock_check.py | pro.stock_basic() | 老接口一次返回全市场快照;新接口分字段拉取,且 pe/area 等字段要另取 |
ts.get_today_all() | datahub/daily_stock_market_info.py、utils/push_msn.py、recordMyChoice.py | pro.daily() 逐日或第三方行情 | 老接口返回当日全市场行情,新接口没有等价单调用法 |
ts.get_hist_data() | select_stock.py、new_stock_break.py(注释中) | pro.daily() | 返回的索引名与列名都不同 |
ts.get_today_ticks() | monitor/big_deal.py、stock_check.py | 逐笔接口(Pro 侧另有权限要求) | 大单监控依赖逐笔成交,权限变更会直接让该功能失效 |
ts.get_apis() / ts.quotes() / ts.close_apis() | monitor/realtime_monitor_ts.py、plot_line.py、recordMyChoice.py、yesterday_zt_monitor.py | — | 这一组是新浪行情通道,不是 Pro 接口;迁移时不能简单换名字,要换成真正的行情源 |
ts.get_realtime_quotes() | monitor/ceiling_break.py、utils/push_msn.py、real_time_big_deal.py | — | 同为新浪通道;封板监控读 b1_v(买一量)就靠它 |
ts.pledged_detail() / ts.stock_pledged() | pledged_validation.py | 股权质押属 Pro 的高积分接口 | 老脚本用 ts 命名空间直接调,Pro 侧需要 pro 对象 |
ts.is_holiday() | recordMyChoice.py | 可用 pro.trade_cal() 自行判断 | 新接口返回的是交易日历表,需要自己转成布尔判断 |
「Tushare 历史教程能不能照搬」的答案是:不能。这个仓库的注释里写着「适用 tushare 0.7.5」,而依赖清单写的是裸 tushare(不锁版本)。老接口与新接口不是改名关系,返回结构、参数命名、权限模型都不同;其中 ts.get_apis() 一组属于新浪行情通道,需要整体替换而不是重命名。本站不逐条断言各接口的下线时间——那需要逐条查官方公告,请以 Tushare 官方当前文档为准。
采集到落库
抓到之后写到哪里:落点与重复运行的行为
| 采集脚本 | 抓到之后写到哪 | 落库方式 | 重复运行会怎样 |
|---|---|---|---|
datahub/jisilu.py | db_stock.tb_bond_jisilu(日库 db_jisilu) | to_sql(..., if_exists='replace'),字段 可转债代码 指定 VARCHAR(10) | 会整表覆盖,历史数据丢失 |
datahub/jisilu.py(公告) | db_stock.tb_bond_release | create table if not exists + update / insert 分支 | 先查再写,相对安全 |
datahub/zdt.py | db_zdt.{日期}{后缀} | to_sql(..., if_exists='fail') | 表已存在直接抛错,同一天无法重跑 |
stockInfo.py | Elasticsearch 索引 cnstock | es.index(index='cnstock', doc_type='doc', ...) | 重复写入会产生重复文档(需自行去重) |
fund/ark_funds.py | MongoDB | insert 文档 | 取决于实现的去重逻辑 |
utils/delivery_order.py | db_stock.tb_delivery_gj_django / tb_delivery_hb_django | 按券商分表写入,先 del df['股东代码'] 等列 | 重复导入会产生重复交割记录 |
store_data.py | SQLite 文件 testdb.db,表 newtable | to_sql(..., flavor='sqlite') | flavor 参数在 pandas 1.0 已移除,现代 pandas 直接报错 |
「抓到了写哪」这件事没有统一层。每个脚本自己决定库名、表名与写入模式,所以同一个数据源在不同脚本里可能落到不同的表。改造时的建议:先在你自己的库里建表,再把 to_sql 的目标改成你的库,不要直接沿用 if_exists='replace' 的写法——它会静默清空历史。
自查清单
要自己接一个新数据源,按什么顺序做
接入一个新数据源前的自查清单
- 在浏览器里手动访问目标端点,确认当前是否需要登录、是否有验证码、返回是否仍是 JSON。预期输出:能在浏览器里看到结构化数据。
- 打开浏览器开发者工具,把请求头与 cookie 完整复制出来。预期输出:一份含
User-Agent、Referer、Cookie的请求头。 - 判断登录态该放在哪:如果是长期 cookie,写进
configure/web_headers.json(需自己新建,仓库里没有);如果是账号密码且有加密,参照datahub/jsl_login.py的做法。预期输出:凭证不落在代码里、也不进 git。 - 决定落库点:MySQL(结构化表格)、MongoDB(嵌套文档)、Elasticsearch(需要检索)还是仅打印。预期输出:明确的库名与表名,并且不用
if_exists='replace'。 - 用一年的历史数据跑一次完整链路,核对行数与关键字段。预期输出:行数与站点上显示的数量级一致。
- 把这次的分页、限频、验证码、字段变化记录下来。预期输出:一份可交接的接入笔记。
FAQ
关于 Rockyzsu/stock 的常见问题
这个仓库要花钱买数据吗?
Tushare 的老接口(ts.get_k_data 等)现在还能用吗?
ts.get_apis() / ts.quotes() 一组属于新浪行情通道,需要整体替换;③select_stock.py 的注释里写的是「适用 tushare 0.7.5」,属早期版本。请以 Tushare 官方当前文档为准。第三条路线 xcsc_tushare 是什么?
xc.set_token(xc_token_pro) 加 xc.pro_api(env='prd', server=xc_server)。关键在于 server 是可配置的,也就是说这些脚本访问的不是官方 API 域名,而是配置里指定的那台服务器。它不在 requirements.txt 里,本站不对其来源、合规性与稳定性做任何判断,请自行核实。集思录要登录,登录麻烦吗?
datahub/jsl_login.py 不是直接 POST 用户名密码,而是先用 execjs 执行仓库里的 js_file/encode_jsl.js,调用 jslencode(text, key) 对用户名和密码做客户端加密,再把密文发到 /account/ajax/login_process/。所以你需要本地有 Node 运行时,否则 execjs 无法工作。另外这份脚本里的加密 key 是硬编码在源码中的。宁稳网那两个脚本为什么直接跑不了?
validate_key.url 去识别。而 datahub/validate_key.py 里 username、password、sign、url 四个字段全是空字符串,注释写的是「找群主要 公众号:可转债量化分析」。也就是说这个能力预设了你要向作者索取服务账号,开箱不可用。行情数据是实时的吗?
monitor/realtime_monitor_ts.py 用 ts.quotes() 循环拉新浪行情;②日频落库——datahub/ 下多数脚本按日采集后写库,供选股与分析消费;③事件驱动——涨停池、公告、龙虎榜按事件抓取。需要「毫秒级」的场景不在这个项目的设计范围内。以源码中的轮询参数为准。