你好,我是zhenguo

这是我的第505篇原创文章
同时作为我的第11个项目:爬取全国城市和编码并数据分析
此系列过往10个项目都在这里:

这几天使用到全国各地城市和对应编码。然后就爬取了一份完整的全国省市区(县)的数据,这里也同你一起分享下。

数据爬取

爬取的网站部分截图如下所示:
数据已经比较规整,其实完全可以手动复制,并paster到文件中。
不过,对于静态网页,爬取一下,也非常方便。
代码只有下面几行:
import requests

from lxml import etree


response = requests.get(
'http://www.mca.gov.cn/article/sj/xzqh/2020/20201201.html'
)

html = etree.fromstring(response.text, etree.HTMLParser())

id_districts = html.xpath(
"//div/table/tr/td/text()"
)

id_districts列表部分截图如下:

数据清洗及存储

做一些基本的清洗,提取表头headers,去头去尾后得到数据行rows,然后转化为csv文件需要的格式:
headers = id_districts[:3]

rows = id_districts[3:-3]


lines = list()

lines.append(
','
.join((headers[0] + 
"-"
 + headers[1], headers[2])))

for
 row 
in
 zip(rows[::2], rows[1::2]):

    line = 
','
.join(row)

if'西沙区,南沙区'
 != line:

        lines.append(line)

需要注意西沙区、南沙区没有分配编码,在此先过滤一下:
最后保存为csv文件:
with
 open(
"distict_code.csv"
'w'
as
 writer:

    writer.write(
'\n'
.join(lines))

数据分析

最后做一个简单的统计分析,提取出省或直辖市,它们的特征是编码最后四位都为0,最后使用pprint模块,美化打印结果:
# 提取出省或直辖市
provinces = [item 
for
 item 
in
 lines[1:] 
if
 item.split(
','
)[0][-4:] == 
'0000'
]

import pprint


pprint.pprint(provinces, width=4)

显示如下,一共有34个省或直辖市:
[
'110000,北京市'
,

'120000,天津市'
,

'130000,河北省'
,

'140000,山西省'
,

'150000,内蒙古自治区'
,

'210000,辽宁省'
,

'220000,吉林省'
,

'230000,黑龙江省'
,

'310000,上海市'
,

'320000,江苏省'
,

'330000,浙江省'
,

'340000,安徽省'
,

'350000,福建省'
,

'360000,江西省'
,

'370000,山东省'
,

'410000,河南省'
,

'420000,湖北省'
,

'430000,湖南省'
,

'440000,广东省'
,

'450000,广西壮族自治区'
,

'460000,海南省'
,

'500000,重庆市'
,

'510000,四川省'
,

'520000,贵州省'
,

'530000,云南省'
,

'540000,西藏自治区'
,

'610000,陕西省'
,

'620000,甘肃省'
,

'630000,青海省'
,

'640000,宁夏回族自治区'
,

'650000,新疆维吾尔自治区'
,

'710000,台湾省'
,

'810000,香港特别行政区'
,

'820000,澳门特别行政区'
]

再看下,目前全国区县以上城市有多少个:
cities = 
set
(lines).difference(
set
(provinces))

print
(f
"全国共有区县以上城市{len(cities)}"
)

结果显示3177个:
全国共有区县以上城市3177

最后,再分析出每个省下对应城市的csv文件,先分析并整理出字典provinces_to_cities
# 省对应区县以上城市字典
code_to_name, provinces_to_cities = dict(), dict()

provinces_set, cities_set = 
set
(provinces), 
set
(cities)

for
 line 
in
 lines[1:]:

if
 line 
in
 provinces_set:

        provinces_to_cities[line] = list()

    code, text = line.split(
","
)

    code_to_name[code] = text


for
 line 
in
 lines[1:]:

if
 line 
in
 cities_set:

        code = line[:2] + 
"0000"
        name = code_to_name[line[:2]+
"0000"
]

        provinces_to_cities[code+
','
+name].append(line)

最后一共保存为34个csv文件,部分截图如下所示:
最后看了下我的家乡山东,共有152个地区县,可谓广阔!
以上就是今天这篇文章,想要csv文件的,在公众号后台回复:全国

宣传我的课程

课程视频制作初衷:根据我过往7年多工作经历,5年多自媒体技术写作经验,以及期间与粉丝们的各种各样的交流,最终我决定打造这个系列课程,全由我一人完成,保证质量。真正帮助那些想从零完成就业的小伙伴们。路在何方,路在脚下。
课程总览:全是Python视频系列课程,包括多门课,帮助你从零到就业。不止一门课,目前已有从零学Python精品120课,正在更新从零学Python网络爬虫,从零学Python数据分析等。初步估计,全部更完至少会有300课。每课长度在2分钟~20分钟不等。
课程服务:课程提供电脑和手机双端学习平台,除了多门课精品视频外,还有配套讲义,完整源码文件。最重要的,会设有班级答疑群,解答疑问。
目前已有23个章节的课程大纲(包括从零学Python编程,从零学爬虫,从零学数据分析),鉴于篇幅有限,我就不一一放到这里了,感兴趣的点击下图二维码去了解:
继续阅读
阅读原文