5

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

 2 years ago
source link: https://www.cnblogs.com/mushrain/p/16222956.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK