python+ BeautifulSoup抓取“全国行政区划信息查询平台”的省市区信息

全国行政区划信息查询平台地址:http://xzqh.mca.gov.cn/map

检查网页源码:在这里插入图片描述

检查网页源码可以发现: 所有省级信息全部在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.第二步:检查该网站实现级联查询的方式,找出查询市区的方式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
根据这段源码可看出,在选择 省级的后,网页会调用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.contentjson_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.contentjson_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

2.第三步:main函数(遍历所有省市区+数据入库)
数据库表结构如下:
在这里插入图片描述
【全部代码如下】:

import requests
from bs4 import BeautifulSoup
import pymysql
import re
import jsonclass 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.contentjson_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.contentjson_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_listdef 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()

代码执行成功后就可以查到中国所有省市区啦!:
在这里插入图片描述
特殊情况:“省直辖县级行政单位”和“自治区直辖县级行政单位”
在这里插入图片描述
部分省有特殊的“直辖县级行政单位”或“自治区直辖县级行政单位”
参考:https://baike.baidu.com/item/省直辖县级行政单位/6903180?fr=aladdin
遇到这种情况有点懵逼,因为没有 区号代码 所以无法关联父子关系。
但是无妨,数据库设计有type字段~直接将省级区号代码作为唯一值给到市,作为区号代码,再将这个值赋值给区,作为区的父级区号代码,这样后台用type+区号代码判断关联关系。

PS:后续
1.由于本身是java项目要用到中国的省市区 2.并且中国的省市区的变化很频繁(市级区级的变化时有发生),因此后期可以用jython将其用到java项目,并且可以写一个job定时任务,定时更新数据库表。

参考文档

https://jingyan.baidu.com/article/d169e1867bd27f436611d829.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

风变编程python论文_如何看待风变编程的 Python 网课?

作为风变推出的python课程的一名学员,很幸运能与风变相遇,更庆幸自己选择学习python,我学习的是python基础课程和爬虫精进课程,目前已经学完了python基础课程,不得不说对我的感触很深,非常想要继续学下去&a…

32利用文件系统保存数据_网易技术实践|Docker文件系统实战

在本文中,我们来实战构建一个Docker镜像,然后实例化容器,在Docker的生命周期中详细分析一下Docker的文件存储情况和DockerFile优化策略。在开始实战之前,我们先介绍一个概念,联合文件系统(Union File Syste…

POI读取word文件,(支持HSSF和XSSF两种方式)

POI读取word文件&#xff0c;&#xff08;支持HSSF和XSSF两种方式&#xff09; 参考&#xff1a;HSSF&#xff0c;XSSF&#xff0c;SXSSF三种方式 1.引用maven&#xff08;版本必须一致&#xff09; <dependency><groupId>org.apache.poi</groupId><art…

pythonsqlite事务_python sqlite3 的事务控制

Python sqlite3 的事务控制官方文档的描述&#xff1a;Controlling TransactionsBy default, the sqlite3 module opens transactions implicitly before a Data Modification Language (DML) statement (i.e. INSERT/UPDATE/DELETE/REPLACE), and commits transactions implic…

二叉树遍历的超简单方法(详细、简单)

二叉树遍历的超简单方法 参考链接&#xff1a;https://wenku.baidu.com/view/e5463e4203d8ce2f0166230a.html 已修改部分问题。 三种常见二叉树的遍历&#xff1a; 先序遍历的递归算法定义&#xff08;简称根左右&#xff09; 若二叉树非空&#xff0c;则依次执行如下操作&a…

怎么看我装的sql能不能用_深入浅出sql优化(三)之单表索引优化

大家好&#xff0c;我是闲水&#xff0c;每天更新java最新最热技术&#xff0c;对java感兴趣的朋友记得关注一下哦。注意 &#xff1a;这是SQL性能优化第三章&#xff0c;点击关注查看前置内容。上篇文章我们主要了解了索引优化的标尺"Explain"怎么用&#xff0c;这一…

java类加载顺序(spring容器下)

执行顺序&#xff1a;父类静态块–>子类静态块–>父类非静态块–>父类构造方法–>子类非静态块–>子类构造方法–>自动装载的方法 子类和父类均加上Service注解&#xff0c;将其交给spring容器管理。 父类&#xff1a; Service public class Father {publ…

python 绘图 hist bin参数_Python-hist,distplot bin宽度不一致问题的解决方案

python的hist有一个bug&#xff0c;之前一直没有解决。绘制直方图的时候&#xff0c;往往出现两组数据由于分布不一样&#xff0c;&#xff0c;导致出来的图片中&#xff0c;虽然是一样数目的bins&#xff0c;但是bin的宽窄不同。而我想得到的是&#xff0c;&#xff0c;虽然数…

Nginx反向代理的使用

1. 常用服务器比较 apache: 功能完善&#xff0c;历史悠久&#xff0c;模块支持非常丰富&#xff0c;属于重量级产品&#xff0c;比较耗费内存。缺点:处理每一个php比较费资源&#xff0c;导致如果高并发时会耗费服务器资源无法处理更多请求。 lighttpd: 内存开销低&#xff0…

python继承语法_python中继承父类的例子(python3的语法)

#codingutf8class Cup:#构造函数&#xff0c;初始化属性值def __init__(self,capacity,color):self.capacitycapacityself.colorcolordef retain_water(self):print("杯子颜色&#xff1a;"self.color"&#xff0c;杯子容量&#xff1a;"self.capacity&quo…

Rabbit发送消息,消费者消费异常

Rabbit发送消息&#xff0c;消费者消费异常 背景&#xff1a; 在步骤1下创建订单&#xff0c;步骤2下提交消息 Transactionalpublic void tradeHandler(Map map) { // 1.生成统一订单 var unifyOrder orderService.create(orderService.getUnifyOrderDTO(fee, alipayOrder));…

jwt token 太长_理解 JWT 鉴权的应用场景及使用建议

JWT 介绍JSON Web Token(JWT)是一个开放式标准(RFC 7519)&#xff0c;它定义了一种紧凑(Compact)且自包含(Self-contained)的方式&#xff0c;用于在各方之间以JSON对象安全传输信息。这些信息可以通过数字签名进行验证和信任。可以使用秘密(使用HMAC算法)或使用RSA的公钥/私钥…

如何使用explain进行SQL语句调优

参考&#xff1a;https://mp.weixin.qq.com/s/kYcrHtE82-sOqNOp_qM4Ig

microsoft vbscript编译器错误怎么解决_win7系统ie应用程序错误怎么办 ie应用程序错误解决方法【详解】...

windows系统自带的ie浏览器很少用户会去使用到&#xff0c;它运行起来比其他的浏览器要慢很多&#xff0c;而且经常会出现各种各样的问题&#xff0c;最近有位win7系统用户&#xff0c;在使用ie浏览器的时候&#xff0c;发生了应用程序错误的情况&#xff0c;那么win7系统ie应用…

简述python爬虫_python爬虫入门篇了解

1. 爬虫分类&#xff1a;1.1 通用爬虫&#xff1a;例如搜索引擎&#xff1a;无差别的收集数据&#xff1b;提取存储关键字&#xff1b;构建索引库&#xff1b;给用户提供搜索接口。1.2 聚焦爬虫&#xff1a;有针对性的编写特定领域数据的爬取程序。2. Robots协议&#xff1a;指…

修改固态硬盘的物理序列号_买固态怕踩坑?收下这些软件,轻松鉴别好坏

再有半个月&#xff0c;就迎接年中的促销旺季。不少朋友都希望趁着各种优惠、跳楼价&#xff0c;组一台梦想机、升级一下自己的电脑。说到体验升级&#xff0c;相信就算是DIY新手和硬件小白都知道&#xff0c;要想电脑快&#xff0c;必须选固态。但是固态参数多&#xff0c;又是…

python乘法表代码注释_Python统计python文件中代码,注释及空白对应的行数示例【测试可用】...

本文实例讲述了Python实现统计python文件中代码,注释及空白对应的行数。分享给大家供大家参考&#xff0c;具体如下&#xff1a;其实代码和空白行很好统计&#xff0c;难点是注释行python中的注释分为以#开头的单行注释或者以开头以结尾 或以"""开头以"&qu…

32位python和64位python区别_python32位和64位有什么区别

python32位和64位有什么区别&#xff1f;64位能够用更大的内存空间&#xff0c;64位可以在64位的系统下运行&#xff0c;但是不能在32位系统下运行。32位能够在32位和64位上运行&#xff0c;考虑到兼容性&#xff0c;建议使用32位的python。如何查看python是32位还是64位可使用…

《常用控制电路》学习笔记——数控锁相环调速电路

序言 今天开始我将把自己学习《常用控制电路》的一些内容发到互联网上&#xff0c;希望能和大家交流学习。 这本书主要介绍了一系列控制电路的经典案例&#xff0c;进行了电路和代码的设计&#xff0c;我将把这本书中学习到的内容和学习的过程尽量准确的分享出来与大家交流&…

《常用控制电路》学习笔记——数字控制直流电动机调速电路

书中该节讲述的电路通过ADC芯片将电位器的阻值转换为电压量&#xff0c;然后使用单片机输出PWM进行电路控制。本电路也可扩展应用至需要模拟量输入与输出的场合。 目录 一、系统设计思路 二、各模块电路分析 2.1电路构成 2.2工作状态分析 三、程序分析 3.1 变量定义 3.…