相关文章推荐
朝气蓬勃的黑框眼镜  ·  中国“最牛”小县城:面积仅800km²,人口 ...·  11 月前    · 
安静的春卷  ·  泰克斯·温特_百度百科·  12 月前    · 
害羞的足球  ·  研发费用加计扣除项目鉴定案例·  1 年前    · 
失恋的白开水  ·  河北省:新交通格局清晰勾勒出“三大经济板块”·  1 年前    · 
骑白马的紫菜汤  ·  天津市法院诉讼服务网·  2 年前    · 
Code  ›  中国行政单位树形图的可视化实战!开发者社区
https://cloud.tencent.com/developer/article/1802475
绅士的烈马
2 年前
超哥的杂货铺

中国行政单位树形图的可视化实战!

前往小程序,Get 更优 阅读体验!
立即前往
腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
超哥的杂货铺
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > 中国行政单位树形图的可视化实战!

中国行政单位树形图的可视化实战!

作者头像
超哥的杂货铺
发布 于 2021-03-16 14:46:26
1.3K 0
发布 于 2021-03-16 14:46:26
举报
文章被收录于专栏: 超哥的杂货铺 超哥的杂货铺

我国幅员辽阔,共有34个省级行政单位,包括23个省、5个自治区、4个直辖市、2个特别行政区。除去中国香港澳门2个特别行政区和台湾省特殊外,大陆地区共有31个省级区划单位。每个省级单位又可以细分为市级,县级,乡镇和村。

行政区划的关系可以用如下的一个树形图表示:根节点(第〇层)为中国(大陆),树的第一层为31个省级单位节点,第二层为省所辖的地级市,第三层(叶子节点)为市所辖区/县,每一个非叶子节点都可以向下展开到叶子节点。每一个叶节点也可以向上追溯至其所属父节点。动态演示过程可点击下方视频查看。

点击上方视频号链接查看动态效果

本篇文章主要来学习从爬虫获取数据到最终实现可视化的过程。

数据来源

本文所用的行政单位划分来自国家统计局2020年的最新标准,其最初目的是为保证第七次全国人口普查的顺利进行。如下图所示,参见文末链接。

网页分析

我们曾经在「 实例讲解利用python进行数据获取与数据预处理 」一文中提到过爬虫的流程为: 请求 , 解析 , 存储 。示意图如下所示。可在点击链接直接查看或后台回复” 北京公交 “获取。

省级数据解析

本次使用的网页是比较简单的静态网页,在网页上右键选择“显示网页源代码”就可以看到下图所示内容。可以发现我们的数据是嵌套在一个 table (表格)标签中,见下图第30行。各省市名称和相应的链接是在第40行的 tr 标签中,并且可以看到有比较明显的样式标记

class='provincetr' 。所以可以使用 xpath 进行数据解析,定位到 tr 标签下每一个 td 标签,获取相应 a 标签的 href 属性和文本,就得到了每个省的链接。

市级和县级数据解析

上一部分得到了每个省的链接,每个链接的内容是该省下的市级单位,如河北省的链接内容是石家庄等市。如果是北京这样的直辖市,则直接显示“市辖区”。

在网页结构上,市一级的数据和省级非常类似:我们需要的数据在 class='citytr' 的 tr 标签中。每一个市的名称和链接,也同样在相应 td 标签下的 a 标签中,下图分别是河北省与北京市的源代码。

获取了市级(如北京“市辖区”)的链接之后,用同样的思路和方法,分析市级下区/县的内容。也有几乎同样的规律:每个区/县的名称和链接在 class='countrytr' 的 tr 标签中。如下图是“北京市辖区”的链接内容, td 下有朝阳区,海淀区等的名称和链接信息。

区县再往下一级到乡镇/街道,乡镇再往下到居委会,也是同样的道理 。相应的 tr 分别为 class='towntr' 和 class='villagetr' 。居委会已经是最小的行政单位,所以没有下一级的链接。由于获取方式相似,我们最终只采集和展示只到了区县一级。另外,由于乡镇及以下数量众多,在频繁请求时,可能会出现失败的情况。

数据获取和存储

前面的分析可以看到,每一级数据的获取是相似的,且获取数据的过程都是先请求再解析。因此可以把一些操作进行一定的封装。在实践时会发现,数据解析时,第一级(省级)和最后一级(居委会级)的解析和其余中间级别有一定的差别,主要是 xpath 路径的差异,因此需要分别进行处理。下面来看具体代码。

代码设计编写

经过以上分析,我把数据获取部分写成了一个简单的类 ContentParse 。类的结构示意如下图,包含一个成员变量 info 和5个方法,分别用于初始化,请求和解析不同级别的数据。

由于对面向对象的理解比较粗浅,这样的设计只追求简单实用,不见得完美,你也可以有其他更科学合理的设计方式,代码也有很多优化的空间。

需要指出,这样的写法并不是一开始就是这样的,中间经过了很多调试和分析,在走通流程的基础上,增加了一些对异常,特殊情况等的处理,才最终形成了这个“能跑通”的版本。为方便理解,我在代码中做了详细的注释。

在后台回复“ 行政 ”,可获取全部代码,数据和结果文件。关于 xpath 的语法和获取方式这里略过,可以在网上或之前的文章里查看,重要的是多实践,在应用中熟练和掌握。

下面类的代码用于构造 ContentParse 类,是后续操作的基础,可以结合注释,在实践时理解和体会。

以上我们定义了一个类用于数据获取和解析,接下来看一下对类的具体使用。我画了一个示意图帮助理解(可能不是特别标准)。

首先需要初始化一个对象,传入初始 url 获取各省级单位的名称和链接,如①所示。接下来在②处,初始化一个获取市级单位的对象,对于①中的每一个省级 url ,获取相应的市级单位和链接。之后以此类推,③处的对象用于根据市级 url 获取县级单位。继续获取乡镇和村也要初始化相应的对象。对每一个 url 都需要调用 get_content() 方法和相应的 parse_content 方法。

关键代码如下,完整代码文件可在后台回复“ 行政 ”获取。

①处代码,获取省级单位

②处代码,获取市级单位

③处代码,获取县级单位

数据存储

以上代码中,最终得到的dataframe就是相应级别的行政区划数据。由于数据量较小,可以直接存储在文件中,使用dataframe的 to_excel 方法即可实现。我已将后续可视化环节用到的区/县一级的完整数据,保存成了一个文件中 countydf.xlsx 。如果前面的代码你没有运行成功,可以直接使用最终结果的文件用于可视化。后台回复“ 行政 ”即可获取。

可视化部分
需求分析

使用上一步保存好的文件进行文章开头树形图的绘制。 pyecharts 中的树形图很容易绘制,关键在于把数据调整为需要的格式,见下面代码的 data 。最后再进行一些美化设置即可。

代码语言: javascript
复制
tree=(
     Tree()
 
推荐文章
朝气蓬勃的黑框眼镜  ·  中国“最牛”小县城:面积仅800km²,人口80万,涌入500家德企_手机新浪网
11 月前
安静的春卷  ·  泰克斯·温特_百度百科
12 月前
害羞的足球  ·  研发费用加计扣除项目鉴定案例
1 年前
失恋的白开水  ·  河北省:新交通格局清晰勾勒出“三大经济板块”
1 年前
骑白马的紫菜汤  ·  天津市法院诉讼服务网
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号