中国行政区划数据爬取并层级体系与编码标准

中国行政区域划分,既行政区划,大体上分省、市、区县、乡镇街道四级,行政区划的勘界、调整、命名等,由国家各级民政部门负责。

每个月,国家民政部会在官网上公示全部县以上行政区划编码和县以下行政区划变更情况。

每年年初,国家统计局会更新一版统计用区划代码,用于统计调查和专项调查,这套数据的底版使用民政数据,一般是去年九十月份的数据。

这是目前最常用的两套行政区划数据,两者都是完全公开的。

一、数据获取

民政部行政区划代码公示网址:www.mca.gov.cn/article/sj/xzqh/2020/

因为是公开数据,我们用3行Python3代码就能获取网页数据,运行脚本,将响应打印到控制台上,可以看出来源数据是表格形式的。

import requests
data=requests.get('http://www.mca.gov.cn/article/sj/xzqh/2020/2020/202003301019.html')
print(data.text)

pic_f72f3cdf.png

只要能解析这个响应,就可以把数据获取下来,用BeautifulSoup解析就行,非常简短的一个脚本:

import requests
from bs4 import BeautifulSoup
data=requests.get('http://www.mca.gov.cn/article/sj/xzqh/2020/2020/202003301019.html')
soup=BeautifulSoup(data.text)
table=soup.find('table')
trlist=table.findAll(name='td',attrs={'class':'xl7030721'})
num=len(trlist)
xzqhlist=[]
for i in range(0,int(num/2)):
    code=trlist[i*2].get_text().replace('xa0','')
    name=trlist[i*2+1].get_text().replace('xa0','')
    xzqhlist.append(code+':'+name)
print(xzqhlist)

pic_68d1335f.png

民政局的数据很少,且都公示在一个网页上,从页面复制一下,放到Excel里都行。

统计局行政区划代码公示网址:www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/

统计局数据是树状结构,要一个一个点,是比较麻烦,的确需要爬一下。

先分析一下各级目录结构。

省级目录:

http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2019/index.html

只有一个index.html页面。

市级目录:

http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2019/11.html

11.html是省级编码的前两位。

区级目录:

http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2019/11/1101.html

11/1101.html的格式是省级编码前两位/区县编码的前四位。

四级目录:

http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2019/11/01/110101.html

11/01/110101.html的格式是省级编码的前两位/区县编码的3、4位/区县编码的前六位。

五级目录:

http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2019/11/01/01/110101001.html

11/01/01/110101001.html的格式是省级编码的前两位/区县编码的3、4位/区县编码的5、6位/乡镇街道编码的前九位。

如果不知道行政区划编码是什么,看后文就行。

统计局行政区划编码的网页是个树状结构,点击按钮进入下一级。在爬虫工程中,先获取index.html的内容,根据省级编码逐级向下构建url,获取全部的行政区划代码。

获取省名称和下一级url的方法:

# 获取省级目录
def getProvince(url):
    data=requests.get(url)
    html=data.content
    html_doc=str(html,'gbk')
    soup = BeautifulSoup(html_doc)
    hreflist=soup.findAll('a',href=True)
    provurl=[]
    for h in hreflist:
        if '京ICP备' in h.get_text():
            continue
        provurl.append([h.get_text(),h['href']])
    return provurl

pic_c9335b5a.png

根据这个就可以拼接出下一级爬虫的url了。

获取城市信息和下级url的方法:

# 获取市级目录
def getCity(url):
    data=requests.get(url)
    html=data.content
    html_doc=str(html,'gbk')
    soup = BeautifulSoup(html_doc)
    # print(soup)
    trlist=soup.findAll('tr',attrs={'class':'citytr'})
    citylist=[]
    for h in trlist:
        alist=h.findAll('a',href=True)
        citycode=alist[0].get_text()
        cityname=alist[1].get_text()
        cityurl=alist[0]['href']
        citylist.append([citycode,cityname,cityurl])
    return citylist

获取区县:

# 获取区县目录
def getCounty(url):
    data=requests.get(url)
    html=data.content
    html_doc=str(html,'gb18030','ignore')
    soup = BeautifulSoup(html_doc)
    trlist=soup.findAll('tr',attrs={'class':'countytr'})
    countylist=[]
    for h in trlist:
        alist=h.findAll('a',href=True)
        if len(alist)>0:
            countycode=alist[0].get_text()
            countyname=alist[1].get_text()
            countyurl=alist[0]['href']
            countylist.append([countycode,countyname,countyurl])
        else:
            attr=h.findAll('td')
            countylist.append([attr[0].get_text(),attr[1].get_text(),'null'])
    return countylist

结果如下:

pic_b2b79ad8.png

爬取其他层级信息的方法都一致,脚本改一改,就可以爬取全量的数据了。

# 获取乡镇街道目录
def getTown(url):
    data=requests.get(url)
    html=data.content
    html_doc=str(html,'gb18030','ignore')
    soup = BeautifulSoup(html_doc)
    trlist=soup.findAll('tr',attrs={'class':'towntr'})
    townlist=[]
    for h in trlist:
        alist=h.findAll('a',href=True)
        if len(alist)>0:
            towncode=alist[0].get_text()
            townname=alist[1].get_text()
            townurl=alist[0]['href']
            townlist.append([towncode,townname,townurl])
        else:
            attr=h.findAll('td')
            townlist.append([attr[0].get_text(),attr[1].get_text(),'null'])
    return townlist
# 获取村社区目录
def getVillage(url):
    data=requests.get(url)
    html=data.content
    html_doc=str(html,'gb18030','ignore')
    soup = BeautifulSoup(html_doc)
    trlist=soup.findAll('tr',attrs={'class':'villagetr'})
    villagelist=[]
    for h in trlist:
        attr=h.findAll('td')
        villagelist.append([attr[0].get_text(),attr[1].get_text(),attr[2].get_text()])
    return villagelist

爬虫脚本在python3环境下运行,安装两个库requests和bs4就够用了。

import requests
from bs4 import BeautifulSoup

爬取数据不是本文重点,重点是了解行政区划划分体系与编码规则。

二、行政区划层级

民政部的数据大体上分省、市、区县、乡镇街道四级,统计局在这个基础上还会向下延伸到社区居民委员会、村委会一级。

全国23个省、5个自治区、4个直辖市、2个特别行政区。

4个直辖市:北京、上海、天津、重庆,是省级行政区划,下一级没有市,直接是区县。

香港、澳门特别行政区也同样。

全国地级行政区共333个,包括293个地级市、7个地区、30个自治州、3个盟。

7个地区:阿里地区、大兴安岭地区、阿克苏地区、喀什地区、塔城地区、和田地区。

30个自治州:吉林延边朝鲜族自治州、湖北恩施土家族苗族自治州、湖南湘西土家族苗族自治州、四川阿坝藏族羌族自治州、四川凉山彝族自治州、四川甘孜藏族自治州、贵州黔复东南苗族侗族制自治州、贵州黔南布依族苗族自治州、贵州黔西南布依族苗族自治州、云南西双版纳傣族自治州、云南文山壮族苗族自治州、云南红河哈尼族彝族自治州、云南德宏傣族景颇族自治州、云南怒江僳僳族自治州、云南迪庆藏族百自治州、云南大理白族自治州、云南楚雄彝族自治州、甘肃临夏回族自治州、甘肃甘南藏族自治州、青海海北藏族自治州、青海黄南藏族自治州、青海海南藏族自治州、青海果洛藏族自治州、青海玉树藏族自治州、青海海西蒙古族藏族自治州、新疆昌吉回族自治州、新疆巴音郭楞蒙古自治州、新疆克孜勒苏柯尔克孜自治州、新疆博尔塔拉蒙古自治州、新疆伊犁哈萨克度自治州

3个盟:锡林郭勒盟、阿拉善盟、兴安盟。

7个地区、30个自治州、3个盟,大部分都是人口稀少的少数民族地区。

在地级市中,还有4个特例,广东中山市、广东东莞市、海南儋州市、甘肃嘉峪关市,下级直接是乡镇街道,没有区县,这跟历史沿革有关,一般都是因为经济发展,直接由区县升格到市。

  1. 区县

全国有1135个市辖区(民政概念)、387个县级市、1323个县、117个自治县、49个旗、3个自治旗、1个林区、1个特区。

市辖区这个概念,民政系统和统计系统不一样。

民政系统的概念,是我们比较熟悉的,例如北京市朝阳区,就是一个市辖区,区一般都是城镇化较好,经济水平较高。

统计局为了便于经济类型(农村经济和城市经济)的区分,将所统计城市第二三产业占比重、非农业人口多的中心城区部分提取出来,称之为市辖区。

县级市是工业化、城镇化较好的县,被撤县设市,但仍受上级地级市的管辖。

县一般是第一产业占比较高的。

自治县,民族自治县,一般都在自治州的管辖下。

旗和自治旗,一般都在内蒙古。

1个林区是,神农架林区。

1个特区是,贵州省六盘水市的六枝特区,一个大型煤矿。

在区县一级中,有30个特例,既省直辖县级市,这30个特例直接由省来管辖,上面没有地级市。

河南省:济源市;

湖北省:仙桃市、潜江市、天门市、神农架林区;

海南省:五指山市、文昌市、琼海市、万宁市、东方市、定安县、屯昌县、澄迈县、临高县、琼中黎族苗族自治县、保亭黎族苗族自治县、白沙黎族自治县、昌江黎族自治县、乐东黎族自治县、陵水黎族自治县;

新疆维吾尔自治区:石河子市、阿拉尔市、图木舒克市、五家渠市、北屯市、铁门关市、双河市、可克达拉市、昆玉市、胡杨河市(2019年12月挂牌)。

4、乡镇街道

全国乡级行政区共38734个,包括8517个街道、20975个镇、8122个乡、966个民族乡、153个苏木、1个民族苏木、1个县辖区(这个数字不准)。

街道一般都在城区。

镇是城乡结合部,城镇化、工业化较好。

乡以农业为主。

民族乡是少数民族人口占多。

苏木是内蒙古特有的。

1个县辖区是河北省张家口市涿鹿县的南山区,民国时期有县辖区的概念,53年的时候县辖区近两万个,后来逐渐撤区并乡建镇,如今硕果仅存1个。

  1. 社区村委会

乡镇街道的下级就是社区居民委员会和行政村村委会。

如果再往下的话,一个社区会管多个居民小区。一个行政村会管多个自然村和场屋。

行政村是行政单位,自然村是因聚居而然形成的。

三、行政区划调整

如果省、市、区县行政区划有调整,包括名称和界线,需要上报到国家民政部和国务院审批。

如果乡镇街道一级有调整,上报到省民政厅和省政府,民政部官网对乡镇街道仅做更新公示,而不做全量公示。

四、行政区划编码

民政编码:

省、市、区县,6位编码;乡镇街道,9位编码。

统计编码:

12位编码,省、市、区县、乡镇街道、社区村委会都有。

民政部和统计局编码的前9位,编码规则都是一样的。民政部没有社区村委会一级,统计局12位编码中的后三位是赋给社区村委会的。

举个例子:

北京市:

民政编码:110000;

统计局编码:110000000000;

因为北京是直辖市,市一级是空的。

北京市市辖区(统计局):110100000000

民政没有统计局这个市辖区的概念。

北京市西城区:

民政编码:110102

统计局编码:110102000000

能看出,虽然北京市是直辖市,没有市一级,但编码中,3、4位会有个占位01。

北京市西城区西长安街街道:

民政编码:110102001

统计局编码:110102001000

北京市西城区西长安街街道南北长街社区居委会

民政行政区划不公示到社区村委会一级。

统计局编码:110102001001

可以看出在编码中,第1、2位表示省;第3、4位表示市,第5、6位表示区县;第7、8、9位表示乡镇街道;第10、11、12位表示社区村委会。

前六位的编码规范可查阅:《中华人民共和国行政区划代码》(GB/T2260-2007):

pic_34b3b19c.png

第7、8、9位编码规则可查阅:《县以下行政区划代码编制规则》(GB/T10114-2003)。

pic_962fd487.png

pic_4acd91cc.png

第10、11、12位编码规则,可查阅《统计用区划代码和城乡划分代码编制规则》。

pic_c874e76a.png

在文件中,明确规定了,统计部门不编制县以上行政区划代码,同意采用《中华人民共和国行政区划代码》国家标准,凡民政部门确认的街道、镇、乡,按照国家标准《县级以下行政区划代码编制规则》编制。

县级以下行政区划代码编制规则说明,001—099表示街道,100—199表示镇,200—399表示乡,400-599表示类乡单位。

但是统计局为了统计经济,会将一些开发区、工矿区、农场等进行类似乡级单位的编码。

pic_3cdd986d.png

村级单位,统计局也以民政部门确认的为准,但会在这个基础上,加一些园区、工矿区、农场等。

pic_ad66b19b.png

五、更多资料:

民政部行政区划代码公示网址:www.mca.gov.cn/article/sj/xzqh/2020/

统计局行政区划代码公示网址:www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/

《中华人民共和国行政区划代码》(GB/T2260-2007):https://max.book118.com/html/2019/0629/7130110122002035.shtm

《县以下行政区划代码编制规则》(GB/T10114-2003):https://wenku.baidu.com/view/75e0206fa45177232f60a2d4.html

统计用区划代码和城乡划分代码编制规则:www.stats.gov.cn/tjsj/tjbz/200911/t20091125_8667.html

国家代码可参见国际标准化组织的ISO 3166-1国际标准:https://baike.baidu.com/item/ISO 3166-1/5269555?fr=aladdin

乡镇勘界实施方案:https://wenku.baidu.com/view/5a5442f80242a8956bece47e.html

玉山县人民政府办公室 关于印发《玉山县部分乡镇行政区划调整后联合勘界实施方案》的通知 www.zgys.gov.cn/publicity_zfbgs/fzgh/fzgh1/59566

民政部关于做好行政区划变更后勘界工作的通知 :mz.tj.gov.cn/zwgk/system/2018/11/24/030011129.shtml

六、总结

数据要知道原理,才能利用。

行政区划数据以民政为准,统计局的编码更适用于统计,一样的位数,放在Excel里,汇总非常方便。

中国行政区划体系非常规范,但是在实际中,仍然会有规则与现状不统一的情况。

原文地址:https://www.cnblogs.com/hustshu/p/14628658.html