国家统计局通用数据爬取思路+代码实现 (超级舒畅的一次爬取经历)
国家统计局通用数据爬取思路+代码实现 (超级舒畅的一次爬取经历)
0、前言
在做一些预测的时候常常会用到国家统计局的数据,之前写的一些爬虫也没能够复用,今天又遇到了这个问题,反复检查之后发现国家统计局的各种数据其实都遵循同一套逻辑,而只需掌握这一个逻辑,我们便可以想要啥就要啥。
1、初见
经典https
不安全🤪🤪🤪🤪🤪
一进到这个网站我立马熟练的点开了,各项数据分类,这里有国家月度数据,国家年度数据,国家季度数据,也有分各个省的数据。
我今天对2021的出生率死亡率非常感兴趣,于是我立马快速切换到年度数据。
随后飞速的在左侧侧边栏找到人口指标下的人口出生率、死亡率和自然增长率。
我也如期拿到了数据
但是总感觉过程不够丝滑,我能不能让这个过程更高效一点?
2、分析
我打开了F12
神奇,冒充开发者。
结果发现原来发现,不论什么数据基本都是同一个接口:
https://data.stats.gov.cn/easyquery.htm
paramters = {
"m": "QueryData",
"dbcode": "fsnd",
"rowcode": "zb",
"colcode": "sj",
"wds": [],
"dfwds": [{"wdcode":"zb","valuecode":"A0303"}],
"k1": 1651675561678
"h": 1,
}
这请求方法是GET,参数又只有这么几个,那么如果我解析了这几个参数,我岂不是想爬什么爬什么,想爬什么时间段就爬什么时间段?
m
:无需多言,就是请求数据dbcode
:我是在想不出这个单词表示的意义,不过当我看到后面fsnd
的时候,我知道这应该是分省年度
的缩写,我想这大抵对应首页的几个数据种类。rowcode
:直译为行编码,一看后面的字,原来是zb
招标啊,colcode
:直译为列编码,后面的sj
应该是时间的缩写wds
:不明所以dfwds
:不明所以,不过这个字段和上面wds
应该很重要k1
:为时间戳h
:好像就是一个常量
简单分析之后我立马上试了一试
OK的完全没有问题,那么接下来就是指定需求了:
- 所有指标一视同仁
- 爬取任意久远的时间段(官网只提供了几个有限的选项)
- 可以自由切换不同的省,不同的数据类(国家年度,分省年度):显然微调
dbcode
即可实现
3、问题解决
3.1、所有指标一视同仁
预想一次性处理所有指标,那么就先得对指标的命名情况有一个了解
dfwds: [{"wdcode":"zb","valuecode":"A0302"}]
在dfwds
中我们发现那个熟悉的词语拼音缩写,zb
指标,后面的应该就对应于这个指标的代码
可以发现A0302
完美对应这个指标在指标树中位置。同时我观察到10号元素不是A10
而是A0A
,所以可以得出大部分数据都是满10进A随后按照字典序提升。
3.2、对任意时间段爬取
官网只提供了一段时间的爬取,但是我想要任意时间段的数据。尝试查看了近20年数据之后,我发现这里的dfwds
变了,现在变成了时间索引,且valuecode
也 变了,变成最近20,我自然联想到直接把20改一改,没准就能行。
果然如期返回了!那我们的推断没有错。
现在我想爬取任意一个指标的任意时间段的数据,经过测试发现原来dfwds真的是一个数组,可以放多个条件
"dfwds": "[{\"wdcode\":\"zb\",\"valuecode\":\"A0202\"},{\"wdcode\":\"sj\",\"valuecode\":\"LAST50\"}]"
把指标信息和时间约束都加到这个字段,从而实现了我们最初的需求。
我立马写成代码测试
4、测试
python nationStatisticdata.py --zb A0302 --sj LAST50 --dbcode hgnd --output 湖北省人口出生死亡自然增长.csv
非常顺利哈哈哈哈!