国家统计局通用数据爬取思路+代码实现 (超级舒畅的一次爬取经历)


国家统计局通用数据爬取思路+代码实现 (超级舒畅的一次爬取经历)

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的完全没有问题,那么接下来就是指定需求了:

  1. 所有指标一视同仁
  2. 爬取任意久远的时间段(官网只提供了几个有限的选项)

国家统计局通用数据爬取思路+代码实现 (超级舒畅的一次爬取经历)

  1. 可以自由切换不同的省,不同的数据类(国家年度,分省年度):显然微调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 

国家统计局通用数据爬取思路+代码实现 (超级舒畅的一次爬取经历)

非常顺利哈哈哈哈!

5、代码

GitHub: https://github.com/HuangXingjie2002/Mush-Spider

发表评论

相关文章