我的第11个项目:爬取全国3177个城市及对应编码
你好,我是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编程,从零学爬虫,从零学数据分析),鉴于篇幅有限,我就不一一放到这里了,感兴趣的点击下图二维码去了解:
阅读原文 关键词
文件
数据
编码
csv文件
城市
最新评论
推荐文章
作者最新文章
你可能感兴趣的文章
Copyright Disclaimer: The copyright of contents (including texts, images, videos and audios) posted above belong to the User who shared or the third-party website which the User shared from. If you found your copyright have been infringed, please send a DMCA takedown notice to [email protected]. For more detail of the source, please click on the button "Read Original Post" below. For other communications, please send to [email protected].
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。