源码 | 国家统计局人口数据采集Python脚本

栏目: Python · 发布时间: 6年前

内容简介:中,州的先生(微信号:taoist_ling,公众号:zmister2016)通过采集国家统计局“国家数据”网站中提供的中国历年人口数据,并对数据进行可视化的探索,发现了一些有意思和令人深思的现象和趋势。有一些小伙伴后台留言希望公布一下采集“国家数据”网站人口数据的代码,在这里,就将总人口、人口出生率、人口年龄结构和人口平均寿命4项数据的代码公布出来,方便大家学习和使用。文章目录
在上一篇文章 《“一胎化”35年,Python可视化初探中国人口变化》

中,州的先生(微信号:taoist_ling,公众号:zmister2016)通过采集国家统计局“国家数据”网站中提供的中国历年人口数据,并对数据进行可视化的探索,发现了一些有意思和令人深思的现象和趋势。

有一些小伙伴后台留言希望公布一下采集“国家数据”网站人口数据的代码,在这里,就将总人口、人口出生率、人口年龄结构和人口平均寿命4项数据的代码公布出来,方便大家学习和使用。

文章目录

涉及到的模块

在这里使用到的第三方库有requests,通过pip命令即可直接安装:

pip install requests
 

使用到的内置库有:

  • json:用于解析接口返回的数据;
  • csv:用于将数据写入到CSV文件中;

同时使用到的header请求头为:

headers = {
    'Host': 'data.stats.gov.cn',
    'Connection': 'keep-alive',
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'X-Requested-With': 'XMLHttpRequest',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
    'Referer': 'http://data.stats.gov.cn/easyquery.htm?cn=C01',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.9',
}
 

生成年份列表

# 获取年份列表
def get_year_list():
    year_list = []
    for i in range(1949,2017):
        year_list.append(str(i))
    return year_list
 

总人口

总人口数据中包含年份、总人口、男性人口、女性人口、城镇人口、乡村人口5项,保存为总人口.csv文件:

# 总人口
def get_total_population():
    year_list = get_year_list()
    with open('总人口.csv', 'a+', encoding='utf-8', newline='') as files:
        fieldnames = ['年份', '年末总人口(万人)', '男性人口(万人)', '女性人口(万人)', '城镇人口(万人)', '乡村人口(万人)']
        writer = csv.DictWriter(files, fieldnames=fieldnames)
        writer.writeheader()
        for year in year_list:
            url = 'http://data.stats.gov.cn/easyquery.htm?m=QueryData&dbcode=hgnd&rowcode=zb&colcode=sj&wds=%5B%5D&dfwds=%5B%7B%22wdcode%22%3A%22sj%22%2C%22valuecode%22%3A%22{year}%22%7D%5D'.format(
                year=year)
            wbdata = requests.get(url, headers=headers)
            jsdata = json.loads(wbdata.text)
            data = jsdata['returndata']['datanodes']
            item = {
                '年份': year + '年',
                '年末总人口(万人)': data[0]['data']['data'],  # 年末总人口(万人)
                '男性人口(万人)': data[1]['data']['data'],  # 男性人口(万人)
                '女性人口(万人)': data[2]['data']['data'],  # 女性人口(万人)
                '城镇人口(万人)': data[3]['data']['data'],  # 城镇人口(万人)
                '乡村人口(万人)': data[4]['data']['data'],  # 乡村人口(万人)
            }
            print(item)
            writer.writerow(item)
 

人口出生率、死亡率和自然增长率

包含年份、出生率、死亡率、自然增长率4项数据,数据保存为出生死亡及自然增长率.csv文件:

# 人口出生率、死亡率和自然增长率
def get_birth_death_rate():
    year_list = get_year_list()
    with open('出生死亡及自然增长率.csv','a+',encoding='utf-8',newline='') as files:
        fieldnames = ['年份', '出生率', '死亡率', '自然增长率']
        writer = csv.DictWriter(files, fieldnames=fieldnames)
        writer.writeheader()
        for year in year_list:
            url = 'http://data.stats.gov.cn/easyquery.htm?m=QueryData&dbcode=hgnd&rowcode=zb&colcode=sj&wds=%5B%5D&dfwds=%5B%7B%22wdcode%22%3A%22sj%22%2C%22valuecode%22%3A%22{year}%22%7D%5D'.format(year=year)
            wbdata = requests.get(url,headers=headers)
            jsdata = json.loads(wbdata.text)
            data = jsdata['returndata']['datanodes']
            item = {
                '年份' : year+'年',
                '出生率' : data[0]['data']['data'], # 人口出生率
                '死亡率' : data[1]['data']['data'], # 人口死亡率
                '自然增长率' : data[2]['data']['data'], # 人口自然增长率
            }
            print(item)
            writer.writerow(item)
 

人口年龄结构及抚养比

包含年份、年末总人口、0-14岁人口、15-64岁人口、65岁及以上人口、总抚养比、少儿抚养比、老年抚养比8项数据,数据保存为人口年龄结构及抚养比.csv文件:

def get_age_structure():
    year_list = get_year_list()
    with open('人口年龄结构及抚养比.csv', 'a+', encoding='utf-8', newline='') as files:
        fieldnames = ['年份', '年末总人口(万人)', '0-14岁人口(万人)', '15-64岁人口(万人)', '65岁及以上人口(万人)', '总抚养比(%)', '少儿抚养比(%)', '老年抚养比(%)']
        writer = csv.DictWriter(files, fieldnames=fieldnames)
        writer.writeheader()
        for year in year_list:
            url = 'http://data.stats.gov.cn/easyquery.htm?m=QueryData&dbcode=hgnd&rowcode=zb&colcode=sj&wds=%5B%5D&dfwds=%5B%7B%22wdcode%22%3A%22sj%22%2C%22valuecode%22%3A%22{year}%22%7D%5D'.format(
                year=year)
            wbdata = requests.get(url, headers=headers)
            jsdata = json.loads(wbdata.text)
            data = jsdata['returndata']['datanodes']
            item = {
                '年份': year + '年',
                '年末总人口(万人)': data[0]['data']['data'],  # 年末总人口(万人)
                '0-14岁人口(万人)': data[1]['data']['data'],  # 0-14岁人口(万人)
                '15-64岁人口(万人)': data[2]['data']['data'],  # 15-64岁人口(万人)
                '65岁及以上人口(万人)': data[3]['data']['data'],  # 65岁及以上人口(万人)
                '总抚养比(%)': data[4]['data']['data'],  # 总抚养比(%)
                '少儿抚养比(%)': data[5]['data']['data'],  # 少儿抚养比(%)
                '老年抚养比(%)': data[6]['data']['data'],  # 老年抚养比(%)
            }
            print(item)
            writer.writerow(item)
 

人口平均预期寿命

包含年份、平均预期寿命、男性平均预期寿命、女性平均预期寿命4项数据,数据保存为人口平均预期寿命.csv文件:

def get_avg_life():
    year_list = get_year_list()
    with open('人口平均预期寿命.csv', 'a+', encoding='utf-8', newline='') as files:
        fieldnames = ['年份', '平均预期寿命(岁)', '男性平均预期寿命(岁)', '女性平均预期寿命(岁)']
        writer = csv.DictWriter(files, fieldnames=fieldnames)
        writer.writeheader()
        for year in year_list:
            url = 'http://data.stats.gov.cn/easyquery.htm?m=QueryData&dbcode=hgnd&rowcode=zb&colcode=sj&wds=%5B%5D&dfwds=%5B%7B%22wdcode%22%3A%22sj%22%2C%22valuecode%22%3A%22{year}%22%7D%5D'.format(
                year=year)
            wbdata = requests.get(url, headers=headers)
            jsdata = json.loads(wbdata.text)
            data = jsdata['returndata']['datanodes']
            item = {
                '年份': year + '年',
                '平均预期寿命(岁)': data[0]['data']['data'],  # 男性平均预期寿命(岁)
                '男性平均预期寿命(岁)': data[1]['data']['data'],  # 人口死亡率
                '女性平均预期寿命(岁)': data[2]['data']['data'],  # 人口自然增长率
            }
            print(item)
            writer.writerow(item)
 

打包

同时,州的先生将 Python 代码和4类的人口数据打包在了一起并上传到了百度网盘上,有需要的小伙伴可以在州的先生微信公众号后台回复 0015 ,获取下载地址:

源码 | 国家统计局人口数据采集Python脚本

对代码有疑问的小伙伴欢迎添加州的先生私人微信号taoist_ling,交流讨论。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

引爆点

引爆点

[美] 马尔科姆·格拉德威尔 / 钱清、覃爱冬 / 中信出版社 / 2006-1 / 29.80元

这本书是《纽约客》杂志专职作家马尔科姆·格拉德威尔的一部才华横溢之作。他以社会上突如其来的流行风潮研究为切入点,从一个全新的角度探索了控制科学和营销模式。他认为,思想、行为、信息以及产品常常会像传染病爆发一样,迅速传播蔓延。正如一个病人就能引起一场全城流感;如果个别工作人员对顾客大打出手,或几位涂鸦爱好者管不住自己,也能在地铁里掀起一场犯罪浪潮;一位满意而归的顾客还能让新开张的餐馆座无虚席。这些现......一起来看看 《引爆点》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具