跳转至

🔥AI副业赚钱星球

点击下面图片查看

郭震AI

数据爬取

编辑日期: 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个地区县,可谓广阔!

京ICP备20031037号-1