数据爬取
编辑日期: 2024-11-28 文章阅读: 次
你好,我是zhenguo 这是我的第505篇原创文章 这几天使用到全国各地城市和对应编码。然后就爬取了一份完整的全国省市区(县)的数据,这里也同你一起分享下。
数据爬取
爬取的网站部分截图如下所示:
数据已经比较规整,其实完全可以手动复制,并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个地区县,可谓广阔!