python 识别省市、区县并组建三级信息数据库

一、网址:

全国行政区划信息查询平台

二、分析并搭建框架

检查网页源码:

python 识别省市 python区县查询_python 识别省市

检查网页源码可以发现: 所有省级信息全部在javaScript下的json中,会在页面加载时加载json数据,填充到页面的option中。


1、第一步:使用正则表达式抓取json数据并解析,组成一个province集合:
# 获取省的集合
       def get_province(self):
        pattern = re.compile(r"var json =(.*?);", re.MULTILINE | re.DOTALL)
        script = self.soup.find("script", text=pattern)
        lists = str(pattern.search(script.text).group(1))
        json_list = json.loads(lists)
        # province_list = set()
        province_dict = dict()
        for json_data in json_list:
            province = json_data['shengji']
            quhua_code = json_data['quHuaDaiMa']
            province_dict.update({quhua_code: province})
            # province_list.add(province)
            # print(province_dict)
        return province_dict
2、第二步:检查该网站实现级联查询的方式,找出查询市区的方式

python 识别省市 python区县查询_全国最新省市区_02

python 识别省市 python区县查询_ci_03

python 识别省市 python区县查询_全国最新省市区_04

根据这段源码可看出,在选择 省级的后,网页会调用selectJson接口进行一个post请求,上图可以看到请求的body和header等信息。

代码:

# 获取市
    def get_city(self, shengji):
        body = ("shengji=" + shengji).encode('UTF-8')
        # body = "shengji='江苏省(苏)'"..encode('UTF-8')
        headers = {'Content-Type': "application/x-www-form-urlencoded; charset=utf-8",
                   'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, "
                                 "like Gecko) Chrome/77.0.3865.120 Safari/537.36"
                   }
        response = requests.post('http://xzqh.mca.gov.cn/selectJson', data=body, headers=headers)
        content = response.content
        json_list = json.loads(content)
        # city_list = set()
        city_dict = dict()
        for json_data in json_list:
            citys = json_data['diji']
            # city_list.add(citys)
            quhua_code = json_data['quHuaDaiMa']
            city_dict.update({quhua_code: citys})
        return city_dict
        # return city_list

    # 获取区
    def get_area(self, shengji, diji):
        body = ("shengji=" + shengji + "&diji=" + diji).encode('UTF-8')
        headers = {'Content-Type': "application/x-www-form-urlencoded; charset=utf-8",
                   'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, "
                                 "like Gecko) Chrome/77.0.3865.120 Safari/537.36"
                   }
        response = requests.post('http://xzqh.mca.gov.cn/selectJson', data=body, headers=headers)
        content = response.content
        json_list = json.loads(content)
        # area_list = set()
        area_dict = dict()
        for json_data in json_list:
            area = json_data['xianji']
            # area_list.add(area)
            area_code = json_data['quHuaDaiMa']
            area_dict.update({area_code: area})
        return area_dict
3、第三步:main函数(遍历所有省市区+数据入库)

数据库表结构如下:

python 识别省市 python区县查询_python_05

三、全部代码:

import requests
from bs4 import BeautifulSoup
import pymysql
import re
import json


class allAreaDataNew(object):
    base_url = 'http://xzqh.mca.gov.cn/map'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36'}
    wb_data = requests.get(base_url, headers=headers)
    wb_data.encoding = 'GBK'
    soup = BeautifulSoup(wb_data.text, 'lxml')

    # print(soup)

    def __init__(self):

        #### 自己数据库信息
        self.db = pymysql.connect("***", "***", "***", "***", charset="utf8mb4")  # mysql数据库
        self.main()
        self.db.close()

    # 入口
    def main(self):
        sql_list = set()
        province_dict = self.get_province()
        for province_code in province_dict:
            province = province_dict[province_code]
            city_dict = self.get_city(province)
            sql_province = "insert into area_config values (null,'" + province + "','PROVINCE'," + province_code + ",0)"
            sql_list.add(sql_province)
            print(
                province_code + "----------------------------------省------------------------------------------" + province + "\n")
            for city_code in city_dict:
                city = city_dict[city_code]
                area_dict = self.get_area(province, city)
                print(city_code + "*******************市****************" + city + "\n")
                # 处理 省直辖县级行政单位
                if city == '省直辖县级行政单位' or city == '自治区直辖县级行政单位':
                    sql_city = "insert into area_config values (null,'" + city + "','CITY'," + province_code + "," + province_code + ")"
                    sql_list.add(sql_city)
                    for area_code in area_dict:
                        area = area_dict[area_code]
                        print(area_code + "-区-" + area + "\n")
                        sql_area = "insert into area_config values (null,'" + area + "','DISTRICT'," + area_code + "," + province_code + ")"
                        sql_list.add(sql_area)
                else:
                    sql_city = "insert into area_config values (null,'" + city + "','CITY'," + city_code + "," + province_code + ")"
                    sql_list.add(sql_city)
                    for area_code in area_dict:
                        area = area_dict[area_code]
                        print(area_code + "-区-" + area + "\n")
                        sql_area = "insert into area_config values (null,'" + area + "','DISTRICT'," + area_code + "," + city_code + ")"
                        sql_list.add(sql_area)
        print(str(sql_list))
        # 事务入库
        empty_sql = "delete from area_config"
        self.connect_mysql(empty_sql, sql_list)

    # 获取省
    def get_province(self):
        pattern = re.compile(r"var json =(.*?);", re.MULTILINE | re.DOTALL)
        script = self.soup.find("script", text=pattern)
        lists = str(pattern.search(script.text).group(1))
        json_list = json.loads(lists)
        # province_list = set()
        province_dict = dict()
        for json_data in json_list:
            province = json_data['shengji']
            quhua_code = json_data['quHuaDaiMa']
            province_dict.update({quhua_code: province})
            # province_list.add(province)
            # print(province_dict)
        return province_dict

    # 获取市
    def get_city(self, shengji):
        body = ("shengji=" + shengji).encode('UTF-8')
        # body = "shengji='江苏省(苏)'"..encode('UTF-8')
        headers = {'Content-Type': "application/x-www-form-urlencoded; charset=utf-8",
                   'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, "
                                 "like Gecko) Chrome/77.0.3865.120 Safari/537.36"
                   }
        response = requests.post('http://xzqh.mca.gov.cn/selectJson', data=body, headers=headers)
        content = response.content
        json_list = json.loads(content)
        # city_list = set()
        city_dict = dict()
        for json_data in json_list:
            citys = json_data['diji']
            # city_list.add(citys)
            quhua_code = json_data['quHuaDaiMa']
            city_dict.update({quhua_code: citys})
        return city_dict
        # return city_list

    # 获取区
    def get_area(self, shengji, diji):
        body = ("shengji=" + shengji + "&diji=" + diji).encode('UTF-8')
        headers = {'Content-Type': "application/x-www-form-urlencoded; charset=utf-8",
                   'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, "
                                 "like Gecko) Chrome/77.0.3865.120 Safari/537.36"
                   }
        response = requests.post('http://xzqh.mca.gov.cn/selectJson', data=body, headers=headers)
        content = response.content
        json_list = json.loads(content)
        # area_list = set()
        area_dict = dict()
        for json_data in json_list:
            area = json_data['xianji']
            # area_list.add(area)
            area_code = json_data['quHuaDaiMa']
            area_dict.update({area_code: area})
        return area_dict
        # return area_list

    def connect_mysql(self, empty_sql, sql_list):
        cursor = self.db.cursor()
        try:
            cursor.execute(empty_sql)
            for sql in sql_list:
                cursor.execute(sql)
            print('=================================更新所有数据完成!=================================')
        except Exception as e:
            print('=================================更新失败!=================================')
            print(e)
            self.db.rollback()
        finally:
            cursor.close()
            # 提交操作
            self.db.commit()


if __name__ == '__main__':
    allAreaDataNew()

代码执行成功后就可以查到中国所有省市区啦!:

python 识别省市 python区县查询_python_06

特殊情况:“省直辖县级行政单位”和“自治区直辖县级行政单位”

python 识别省市 python区县查询_ci_07

注意:部分省有特殊的“直辖县级行政单位”或“自治区直辖县级行政单位”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/882184.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探秘 Web Bluetooth API:连接蓝牙设备的新利器

引言 随着物联网技术的快速发展,蓝牙设备在日常生活中扮演着越来越重要的角色。而在 Web 开发领域,Web Bluetooth API 的出现为我们提供了一种全新的方式来连接和控制蓝牙设备。本文将深入探讨 Web Bluetooth API 的使用方法和原理,帮助开发…

浅显易懂的Git教程

Git概述 SVN与Git的对比 SVN(Subversion) 类型:集中式版本控制系统 工作流程: 从中央服务器下载最新版本到本地。在本地进行开发。提交更改回中央服务器。 优点: 简单易用,适合小型团队。版本历史清…

vs2022快捷键异常不起作用解决办法

安装了新版本的vs2022,安装成功后,发现快捷键发生异常,之前常用的快捷键要么发生改变,要么无法使用,比如原来注释代码的快捷键是ctrlec,最新安装版本变成了ctrlkc,以前编译代码的快捷键是F6或者…

初始MYSQL数据库(6)—— 事务

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: MYSQL 目录 事务的概念 事务的ACID特性 使用事务 查看支持事务的存储引擎 事务的语法 保存点 自动/手动提交事务 事务的隔离性和…

Python模拟鼠标轨迹[Python]

一.鼠标轨迹模拟简介 传统的鼠标轨迹模拟依赖于简单的数学模型,如直线或曲线路径。然而,这种方法难以捕捉到人类操作的复杂性和多样性。AI大模型的出现,能够通过深度学习技术,学习并模拟更自然的鼠标移动行为。 二.鼠标轨迹算法实…

【原创】java+swing+mysql仓库管理系统设计与实现

个人主页:程序员杨工 个人简介:从事软件开发多年,前后端均有涉猎,具有丰富的开发经验 博客内容:全栈开发,分享Java、Python、Php、小程序、前后端、数据库经验和实战 文末有本人名片,希望和大家…

Qt开发技巧(四)“tr“使用,时间类使用,Qt容器取值,类对象的删除,QPainter画家类,QString的转换,用好 QVariant类型

继续讲一些Qt技巧操作 1.非必要不用"tr" 如果程序运行场景确定是某一固定语言,就不需要用tr,"tr"之主要针对多语种翻译的,因为tr的本意是包含英文,然后翻译到其他语言比如中文,不要滥用tr,如果没有…

‌内网穿透技术‌总结

内网穿透是一种网络技术,通过它可以使外部网络用户访问内部网络中的设备和服务。一般情况下,内网是无法直接访问的,因为它位于一个封闭的局域网中,无法从外部访问。而通过内网穿透,可以将内部网络中的设备和服务暴露在…

底盘四轮转向运动学解析(含代码)

目录 写在前面的话四轮转向运动学解析四轮转向理论图解robot_control.py 完整代码关键参数完整代码 公式解析(根据代码)反相--模式1详细图解 正相--模式2轴心--模式3 写在前面的话 网上找了很多资料,对于四轮转向运动学描述的很少&#xff0…

爬虫过程 | 蜘蛛程序爬取数据流程(初学者适用)

蜘蛛程序(也称网络爬虫,是搜索引擎的重要组成部分) 主要功能:遍历互联网,抓取网站信息并建立索引,便于用户在搜索引擎中检索到最新的网页内容工作原理:从初始网站页面的URL开始,发送…

最适配达梦、人大金仓的sql工具是什么?

SQLynx是一款功能强大的数据库管理工具,它不仅支持Oracle、MySQL等国际主流数据库,还很好地支持了武汉达梦、人大金仓等国产数据库。这款工具具有以下几个特点: 1.广泛支持:SQLynx支持多种数据库系统,包括PostgreSQL、…

MySQL学习笔记(持续更新中)

1、Mysql概述 1.1 数据库相关概念 三个概念:数据库、数据库管理系统、SQL 名称全称简称数据库存储数据的仓库,数据是有组织的进行存储DataBase(DB)数据库管理系统操纵和管理数据库的大型软件DataBase Mangement System&#xf…

电子看板实时监控数据可视化助力工厂精细化管理

在当今竞争激烈的制造业领域,工厂的精细化管理成为提高竞争力的关键。而电子看板实时监控数据可视化作为一种先进的管理工具,正为工厂的精细化管理带来巨大的助力。 一、工厂精细化管理的挑战 随着市场需求的不断变化和客户对产品质量要求的日益提高&am…

Qt 模型视图(三):视图类QAbstractItemView

文章目录 Qt 模型视图(三):视图类QAbstractItemView1.基本概念1.1.使用现有视图1.2.使用模型1.3.使用模型的多个视图1.4.在视图之间共享选择 Qt 模型视图(三):视图类QAbstractItemView ​ 模型/视图结构是一种将数据存储和界面展示分离的编程方法。模型存储数据,视…

Ubuntu22.04关闭631端口的方法

何为631端口? 631端口主要用于访问和控制网络打印服务,是linux下CUPS(Common UNIX Printing System,通用UNIX打印系统)服务的端口。Linux中的CUPS(Common UNIX Printing System,通用UNIX打印系…

VisualStudio的“应用代码更改“按钮功能

无意发现这个按钮,因为开发这么多年也没专门尝试这个按钮,于是好奇它的功能。 光标放在按钮上面提示了“应用代码更改”,于是猜想应该是在调试不断开的情况下支持热应用更改。 经过验证,功能确实如同猜想的一样,具体验…

【Elasticsearch系列廿一】ES7 SQL 新特性

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

基于c++实现的简易shell

代码逻辑 核心思想 解析命令行,拆解命令及其选项创建子进程,在子进程中执行命令如果是前台执行命令,则父进程就阻塞等待子进程中命令执行结束后回收子进程的资源如果是后台执行命令,则父进程不进行阻塞等待,可继续向下…

【ArcGIS微课1000例】0123:数据库中要素类批量转为shapefile

除了ArcGIS之外的其他GIS平台,想要打开ArcGIS数据库,可能无法直接打开,为了便于使用shp,建议直接将数据库中要素类批量转为shapefile。 文章目录 一、连接至数据库二、要素批量转shp一、连接至数据库 打开ArcMap,或者打开ArcCatalog,找到数据库连接,如下图: 数据库为个…

Laravel邮件发送:从配置到发邮件的指南!

Laravel邮件发送功能如何实现?怎么使用Laravel发信? Laravel作为一款流行的PHP框架,提供了强大且易用的邮件发送功能。AokSend将详细介绍如何从配置到实际发送邮件的全过程,帮助你快速掌握Laravel邮件发送的技巧。 Laravel邮件发…