人口普查的数据,到底该去哪儿查?我原以为打开国家统计局网站、找到公报、复制粘贴就完事了。真动手才发现这是两件事:查到和查对,中间隔着一层叫"口径"的东西。
起因:我只是想查一个数
做区域消费力对比,要分省常住人口,而且得能追历史年份——只看一年没法判断趋势。第一反应是去翻普查公报,第二反应是找个能批量拉的 API。两个方向我都走了,踩的坑不一样。
这里先说结论,省得你重走一遍:免费公开数据从来不缺,缺的是"这份数字到底统计的是谁"的说明。我在财经公开数据源整理那篇里讲过免费与付费的边界,这次是同一类问题的另一个切面——不是钱的问题,是口径的问题。
过程:先把能白拿的口子摸了一遍
先看普查公报本身。第七次全国人口普查的标准时点是 2020 年 11 月 1 日零时,公报由国统局与国务院人口普查领导小组办公室在 2021 年 5 月 11 日发布。公报原文写明:全国人口(大陆 31 个省区市和现役军人)共 1411778724 人;全国总人口含港澳台为 1443497378 人。公报末尾有一句很关键的话——"本公报数据均为初步汇总数据"。
这几个数字是权威的,但它是 PDF 和网页,人工抄进表格可以,想追年度序列就抓瞎了。要序列,得走接口。
我用的是世界银行 Indicators API v2,免密钥,CC BY 4.0 需署名:
https://api.worldbank.org/v2/country/chn/indicator/SP.POP.TOTL?format=json&date=2018:2025 返回是两段:第一段是 meta(页码、总数、sourceid、lastupdated),第二段才是数据数组。本次实测 lastupdated 是 2026-07-13。多国查询把国家码用分号拼起来,比如 chn;usa;jpn;ind,一次请求拿四国,省掉三轮往返。
这段用标准库就够了,urllib.request 加个 User-Agent 头,json.loads 之后先读 meta 再取数组。我特意没引第三方包——源越少,半年后复现的可能性越大。这套路数和我在空气质量公开数据采集里换免密钥 API 的经历一样:能跑通是第一关,跑通之后才是正经活。
踩坑:我以为拿到的是普查原始数
第一版脚本跑出来,中国 2020 年 SP.POP.TOTL 是 1411100000。我盯着这串数看了半天——公报是 1411778724,差了约 68 万。
我原本以为是自己参数写错了,回去翻指标定义才明白:世行这个指标的 sourceOrganization 第一位明明白白写着 World Population Prospects, United Nations (UN),后面才跟着各国统计机构的数据库。也就是说,这是一条基于普查与其他资料做的年度估计,不是普查当天的登记数。两个数字都没错,统计的不是同一个东西。
那一刻我有点想笑:折腾半天,卡住我的不是接口、不是限流,是我自己默认了"人口数就是人口数"。批量采集里的那些坑大多也这样——被封 IP、验证码、数据错乱,看着五花八门,根子常常是前提没对齐。
解法:把口径写在字段旁边
后来我给自己定了三条规矩,写在采集脚本的注释里,每次新接一个源就照着做:
- 字段名后面必须带口径。不写"人口",写"普查登记人口(2020-11-01 时点)"或"年度估计人口(UN WPP 口径)"。三个月后回来看表,光靠脑子记必错。
- lastupdated 跟着数据一起落库。世行每年 4–5 月会做年度修订改历史值,引用时不写更新时间,等于埋雷。
- 遇到 null 不填 0、不插值。世行不少指标在低收入国家和早年份缺得厉害,补出来的数字比缺着更害人——缺着至少能提醒你换个源。
顺带一句老规矩:采公开数据也要守目标平台的用户协议与 robots 约定,控制频率,不碰登录态和非公开接口,这点我在采集合规提醒里写过,不再展开。开放授权的数据用起来省心,但省心不等于可以不管口径。
验证:三组数字对不上,但能对上原因
我把能找到的对照都摆到一张表上,反倒踏实了:
| 指标 | 七普公报(2020-11-01 时点) | 世行口径(2020 年度) | 差异 |
|---|---|---|---|
| 全国人口 | 1411778724 人 | 1411100000 人 | 约 68 万 |
| 城镇人口比重 | 63.89% | 63.52% | 0.37 个百分点 |
| 65 岁及以上占比 | 13.50% | 12.65% | 0.85 个百分点 |
三组都对不上,但每组对不上的原因都能说清:一个是普查登记时点数、一个是年度估计值;城乡划分的口径本就不同;年龄结构的分组与分母也有差别。真正的错误不是数字不一致,是拿 A 口径的数去验证 B 口径的结论。
世行这条序列本身也有价值。在它的口径下,中国人口 2021 年见顶于 1412360000,之后逐年回落,2025 年是 1406585000;65 岁及以上占比从 2018 年的 11.52% 一路抬到 2025 年的 14.91%。趋势方向和普查揭示的人口流动、家庭户小型化是一致的——比如公报里"跨省流动人口 12484 万人、人户分离人口十年增长 88.52%"这组数,和我在城市购房需求迁移里看到的跨省流动收缩是同一件事的两面。方向上能互相印证,绝对值上不能互相替代。
常见问题
普查公报和世行数据该用哪个?
看你要回答什么问题。要一个权威的、有法定效力的时点数,用公报;要一条能横向比国家、纵向比年份的连续序列,用世行 API。别混着当同一个数用。
世行 API 真的一行代码都不用注册吗?
v2 端点是免密钥的,直接 GET 就行。v1 早在 2020 年 6 月就停用了,搜到的老教程还在教 v1 的写法,别照抄。
能不能直接把采到的数据打包发出去?
世行数据是 CC BY 4.0,可商用但必须署名,正文要写明来源与 lastupdated。国内普查数据的使用以官方最新公布为准,做二次分发前先看清公布方的条款。
家里要用的表,是不是必须精确到个位?
不必。人口这类数,做区域对比时保留到万位甚至百万位更稳,个位数的精度在估计口径下没有意义,反而会把口径差异放大成"看起来很大的矛盾"。把精度标出来,比把位数堆满有用。
为什么我拉的数和别人文章里的不一样?
先别怀疑接口。核对三件事:指标码是不是同一个、年份是日历年还是普查年、lastupdated 是不是同一版。九成差异出在这三处。
数据出处:第七次全国人口普查公报(第二号),国家统计局,stats.gov.cn;World Bank Indicators API v2,官方文档,CC BY 4.0。文中数字为本次实测结果,具体数值以官方最新公布为准。想看本站整理好的数据集,可以翻358 城市百度指数日均数据集那一类数据资源库条目。

