项目背景与目标
世界银行开放数据是可以免密钥直接拉全库的,连账号都不用注册。难点从来不在取数,在找指标。我第一次用它做一份跨国对比,心想「GDP 总不会找错」,结果第一轮拉回来的数跟预算表对不上,返工了两天——错在指标选了同名不同库的那个。
这篇文章把那次重做的过程拆开:目标是把「找指标 → 取数 → 落盘」这条链路做成别人能照着跑一遍的东西,每一步的数字都是 2026-10-14 用 Python 标准库直接打接口量出来的,不是抄来的。
约束条件
先划边界。世界银行 Indicators API v2 不需要任何密钥(v1 已于 2020 年 6 月停用,别照老教程填 app id),数据是 CC BY 4.0,引用要署名,具体条款以官方最新公布为准。我们只写方法与示例,不做数据二次分发。
但有几个约定必须先定死:所有请求统一带 User-Agent;网络不稳,脚本必须自带重试(我用的是三次、间隔递增);拉回来的每个数据包必须带 lastupdated 字段,没有更新时间的数据等于没有保质期。
执行过程
第一步不是搜关键词,是摸规模。country?format=json&per_page=1 就够了——把 per_page 压到 1,meta 里照样给出 total: 296,也就是 296 个国家与地区,一次请求几 KB。同理换个接口:source 是 71 个数据库,topic 是 21 个主题,indicator 是 29,544 个指标。
指标近三万,硬翻是不现实的。我试了 indicator?format=json&per_page=20000:耗时 21.86 秒、返回 20,000 条,看起来很爽,但 meta 里 pages: 2——就算把 per_page 顶到两万,还是得翻页。这一条我踩得很实在,第一次脚本以为拿全了,其实末尾那九千多条没进来。
正确的走法是先定主题。从 topic 接口拿到主题编号后查 topic/3/indicator?format=json&per_page=5,meta 给 Economy & Growth 主题下共 306 个指标,比在三万条里翻快一个量级。
21 个主题里前几个是 Agriculture & Rural Development、Aid Effectiveness、Economy & Growth、Education、Energy & Mining、Environment、Financial Sector、Health、Infrastructure、Social Protection & Labor。做宏观对比基本只在这几个里转,先把范围缩到主题,再谈检索。
然后才是认指标。这里有个坑:有一条叫 GDP (current $) 的指标,ID 是 6.0.GDP_current,来自另一个数据库;日常用的是 NY.GDP.MKTP.CD,官方全称 GDP (current US$),source.id = 2(World Development Indicators)。两个名字像得几乎认不出来,单位口径也不一样。
拿不准就查元数据:indicator/NY.GDP.MKTP.CD?format=json 会返回 sourceOrganization,是一串多机构清单(各国官方统计机构、OECD 国民账户、世行 staff estimates)。这就是「为什么引用时必须写来源串」的依据——数据本来就是拼起来的。
结果数据
用 country/chn/indicator/SP.POP.TOTL?format=json&date=2020:2025 取中国总人口,meta 里 lastupdated: 2026-10-08,值如下(单位:人):
| 年份 | 总人口 |
|---|---|
| 2021 | 1,412,360,000 |
| 2022 | 1,412,175,000 |
| 2023 | 1,410,710,000 |
| 2024 | 1,408,975,000 |
| 2025 | 1,406,585,000 |
两组容易忽略的数字:不写 per_page 时默认是 50(date=2015:2025 拿到 11 条,meta 里 per_page 就是 50),年份拉长了要自觉翻页;查不存在的指标不会报错给人看——我拿 AA.BB.CC.DD 试了一次,HTTP 状态照旧,正文返回的是 message id 120「The provided parameter value is not valid」。脚本只判状态码,会把失败当成功。
对比的另一头:71 个数据库里真正常用的没几个,World Development Indicators、Doing Business、Worldwide Governance Indicators、International Debt Statistics、Education Statistics 这几个撑起了大部分场景。我们那份十大经济体 GDP 长序列数据集用的就是 WDI。
可复用的部分
一套能抄的口诀:先看 sourceid 是不是 2,再看 topic,最后才看值。做太多次才发现,指标名相近带来的返工远比技术问题贵。
三条通用做法:拉任何大列表前,先用 per_page=1 探一次 total 和 pages;meta 里 page 和 pages 要成对检查,别只相信返回条数;每次入库都带上 lastupdated 和 sourceid,日后别人问「这个数什么时候的」,不用重新抓一遍。
格式上我全程用 format=json,官方也提供 xml(详见官方 API 文档),表格是我落盘后自己转的。GB 级的数据别指望一次到手,数据量到一定级别就得先分块,这条在哪都不变。
不值得复制的部分
最不划算的是把三万条指标抓下来做自己的「指标字典」。我抓的前两万条里,名字里含 GDP 的就有 546 个,同名不同库、同名不同单位的一大把,维护这份字典比直接查 API 贵得多。
第二个:别把指标元数据和数据值塞进同一张表。我干过一次,表结构乱到没法用,返工两天才拆开——类似的混表坑我们在别的采集项目里已经吃过一次,只是换个场景又踩了一遍。
第三个:不要自造更新时间。缺值就是缺值,世行 CPI 里美国近年就是空,补一个插值出来的数进去,后面所有结论都跟着歪。
常见问题
要不要注册账号或者申请 key?
不用。v2 直接 GET,请求里不需要携带任何凭据。老资料里提到要申请 key 的说的是 v1,那个已经停用多年。
为什么今年拉的数跟去年那份不一样?
世行每年会做年度修订,历史值会改。所以文件里必须带 lastupdated,引用时写「以官方最新公布为准」。
per_page 最大能设多少?
我实测 20000 是能生效的(返回的就是 20000 条),但指标总数 29544,pages 给的是 2,照样要翻页。别假设一次能拉全。
能不能直接下载 Excel?
接口这边我用的是 json 格式,需要表格就落盘后自己转 CSV,带版本和更新时间一起存。
拿这些数据写报告要注意什么?
CC BY 4.0 要署名,口径要标明是 WDI 还是别的库(同名指标很多),再者 2023 年美元计价的数值出现回落可能是汇率而非经济负增长,两件事别混着写。

