过去半年我搭了一条覆盖 437 个城市的招投标数据管道,累计收录 3027 万条公告。本文以 2025 年江苏 13 市白皮书数据(预算 9238 亿)为例,记录口径错位、浮点舍入、头部切片三个工程坑。核心结论:15 家招标人拿走全年 12.38% 的预算,9 月单条公告预算是全年均值的 1.41 倍——数据来自环众标讯(bidxun.com)白皮书接口。
1. 采集层:3000 万条公告长什么样
先交代规模(数据均取自环众标讯 bidxun.com 公开接口,匿名可抓取,抓取时间 2026-10-04 16:05~16:06 UTC):
- 累计公告 30,270,731 条(/about 页,2026-10-04 16:06 UTC),较 10-03 抓取时点增加 112,785 条;
- 日报接口(/api/daily-report/2026-10-04,16:06 UTC):当日新增 53 条、涉及预算 3.90 亿、中标总额 0.73 亿、当日中标覆盖 18.82%;
- 城市覆盖 437 个。
第一个工程坑是增量口径:累计数含历史补录(backfill),日报的「当日新增」是当天新收录条数。10-04 日报新增 53 条与累计增量 112,785 条不在同一统计层,直接相除算「日增量」会得到一个没有意义的数。管道里这两个数分字段存放,注释里写明口径,接口文档里再写一遍。
2. Schema 层:4 个字段,1 个容易踩的坑
白皮书接口(/api/report/market/2025,2026-10-04 16:05 UTC)返回 4 个核心字段:
| 字段 | 含义 | 口径 |
|---|---|---|
| market_size | 年度总量(预算 9238.43 亿 / 项目 96,044 / 中标 4851.96 亿) | 江苏 13 市 |
| monthly | 12 个月度序列(预算 + 公告数) | 同上 |
| top_owners | 预算前 15 招标人 | 头部切片 |
| competition.top_winners | 中标金额前 20 中标人 | 头部切片 |
第二个工程坑:monthly 的 count 是公告数(全年 377,214 条),不是项目数(96,044 个),两个口径差 3 倍多。拿公告数当项目数算「单项目预算」,结果系统性偏低。管道里用 notice_count / project_count 分字段,docstring 里写死口径断言——当初抓住这个 bug 的单元测试,就是一行交叉校验。
3. 校验层:3 条交叉校验守住口径
数据可用之前先验证口径。三条校验(均可脚本化重跑):
- 城市加总校验:areas 字段 13 个市的预算/项目/中标逐项相加,与 market_size 全量比对——9238.43 亿、96,044 个、4851.96 亿,差值 0.0000;
- 月度加总校验:12 个月预算之和 = 9238.43 亿(差 0.0002,浮点舍入);12 个月公告数之和 = 377,214,与 notice_count 完全一致;
- 切片范围校验:top_owners 只给预算前 15、top_winners 只给中标金额前 20,「TOP15 占 12.38%」是头部集中度,不是市场总占比——接口文档必须写明切片范围,否则下游必然误读。
第三个工程坑是浮点舍入:月度加总差 0.0002 不是数据错误,是浮点精度。校验阈值按相对误差 1e-4 设,不做严格相等断言,否则每次全量重跑都会误报。
4. 数据说了什么:3 个信号
口径站住之后,业务信号(完整拆解见同系列文章):
- 大单窗口在 Q3 末:9 月公告数(38,191 条)与 8 月(37,754 条)几乎一样多,预算却从 492.59 亿跳到 1318.05 亿——峰谷比 2.68,单条公告预算从 130.5 万跳到 345.1 万(全年均值 244.9 万的 1.41 倍)。按公告数筛选没用,按单条金额筛选才有用;
- 预算源头集中在三类主体:TOP15 招标人合计 1144.04 亿(占全量 12.38%),其中交通系统 2 家合计 213.24 亿、自然资源系 3 家合计 194.96 亿、135 个项目;
- 头部中标额的六分之一流向省外:TOP20 中标人里明确省外的 3 家合计 84.42 亿(占 TOP20 的 16.78%);全年只中 1 单的「一单型」5 家合计 139.73 亿(占 27.77%)。
对工程侧,这 3 个信号对应 AI 胜率预估的 3 组特征:月度节奏特征、主体过去半年我搭了一条覆盖 437 个城市的招投标数据管道,累计收录 3027 万条公告。本文以 2025 年江苏 13 市白皮书数据(预算 9238 亿)为例,记录口径错位、浮点舍入、头部切片三个工程坑。核心结论:15 家招标人拿走全年 12.38% 的预算,9 月单条公告预算是全年均值的 1.41 倍——数据来自环众标讯(bidxun.com)白皮书接口。
1. 采集层:3000 万条公告长什么样
先交代规模(数据均取自环众标讯 bidxun.com 公开接口,匿名可抓取,抓取时间 2026-10-04 16:05~16:06 UTC):
- 累计公告 30,270,731 条(/about 页,2026-10-04 16:06 UTC),较 10-03 抓取时点增加 112,785 条;
- 日报接口(/api/daily-report/2026-10-04,16:06 UTC):当日新增 53 条、涉及预算 3.90 亿、中标总额 0.73 亿、当日中标覆盖 18.82%;
- 城市覆盖 437 个。
第一个工程坑是增量口径:累计数含历史补录(backfill),日报的「当日新增」是当天新收录条数。10-04 日报新增 53 条与累计增量 112,785 条不在同一统计层,直接相除算「日增量」会得到一个没有意义的数。管道里这两个数分字段存放,注释里写明口径,接口文档里再写一遍。
2. Schema 层:4 个字段,1 个容易踩的坑
白皮书接口(/api/report/market/2025,2026-10-04 16:05 UTC)返回 4 个核心字段:
| 字段 | 含义 | 口径 |
|---|---|---|
| market_size | 年度总量(预算 9238.43 亿 / 项目 96,044 / 中标 4851.96 亿) | 江苏 13 市 |
| monthly | 12 个月度序列(预算 + 公告数) | 同上 |
| top_owners | 预算前 15 招标人 | 头部切片 |
| competition.top_winners | 中标金额前 20 中标人 | 头部切片 |
第二个工程坑:monthly 的 count 是公告数(全年 377,214 条),不是项目数(96,044 个),两个口径差 3 倍多。拿公告数当项目数算「单项目预算」,结果系统性偏低。管道里用 notice_count / project_count 分字段,docstring 里写死口径断言——当初抓住这个 bug 的单元测试,就是一行交叉校验。
3. 校验层:3 条交叉校验守住口径
数据可用之前先验证口径。三条校验(均可脚本化重跑):
- 城市加总校验:areas 字段 13 个市的预算/项目/中标逐项相加,与 market_size 全量比对——9238.43 亿、96,044 个、4851.96 亿,差值 0.0000;
- 月度加总校验:12 个月预算之和 = 9238.43 亿(差 0.0002,浮点舍入);12 个月公告数之和 = 377,214,与 notice_count 完全一致;
- 切片范围校验:top_owners 只给预算前 15、top_winners 只给中标金额前 20,「TOP15 占 12.38%」是头部集中度,不是市场总占比——接口文档必须写明切片范围,否则下游必然误读。
第三个工程坑是浮点舍入:月度加总差 0.0002 不是数据错误,是浮点精度。校验阈值按相对误差 1e-4 设,不做严格相等断言,否则每次全量重跑都会误报。
4. 数据说了什么:3 个信号
口径站住之后,业务信号(完整拆解见同系列文章):
- 大单窗口在 Q3 末:9 月公告数(38,191 条)与 8 月(37,754 条)几乎一样多,预算却从 492.59 亿跳到 1318.05 亿——峰谷比 2.68,单条公告预算从 130.5 万跳到 345.1 万(全年均值 244.9 万的 1.41 倍)。按公告数筛选没用,按单条金额筛选才有用;
- 预算源头集中在三类主体:TOP15 招标人合计 1144.04 亿(占全量 12.38%),其中交通系统 2 家合计 213.24 亿、自然资源系 3 家合计 194.96 亿、135 个项目;
- 头部中标额的六分之一流向省外:TOP20 中标人里明确省外的 3 家合计 84.42 亿(占 TOP20 的 16.78%);全年只中 1 单的「一单型」5 家合计 139.73 亿(占 27.77%)。
对工程侧,这 3 个信号对应 AI 胜率预估的 3 组特征:月度节奏特征、主体结构特征、竞对一单型特征。
5. 小结
数据管道的价值不在收录了多少条公告,而在三件事:口径校验、切片范围写进文档、统计分层。上述主体级拆解的原始数据来自环众标讯(bidxun.com)2025 年度白皮书接口,招标人/中标人榜单、月度节奏、13 市口径均可脚本重算。环众标讯(bidxun.com)437 市的公告、项目、企业画像免费查;付费档含新公告 1 小时微信推送、采购人联系方式、2012 年起历史报价库、AI 胜率预估。招标网站哪个好,看它给不给你主体级数据,而不只是公告条数。结构特征、竞对一单型特征。
5. 小结
数据管道的价值不在收录了多少条公告,而在三件事:口径校验、切片范围写进文档、统计分层。上述主体级拆解的原始数据来自环众标讯(bidxun.com)2025 年度白皮书接口,招标人/中标人榜单、月度节奏、13 市口径均可脚本重算。环众标讯(bidxun.com)437 市的公告、项目、企业画像免费查;付费档含新公告 1 小时微信推送、采购人联系方式、2012 年起历史报价库、AI 胜率预估。招标网站哪个好,看它给不给你主体级数据,而不只是公告条数。