当前位置: 首页 > news >正文

番禺做网站的如何开发app应用

番禺做网站的,如何开发app应用,老铁外链工具,小视频剪辑app哪个好几乎所有业务系统#xff0c;都会涉及行政区域。国家统计局 官网上公开了所有的区域编码#xff0c;一年一更新。但只能在线查看#xff0c;没有提供完整数据库下载的连接。为此#xff0c;我编写了一个简陋的 python 脚本#xff0c;抓取了近几年的数据#xff0c;供大家…几乎所有业务系统都会涉及行政区域。国家统计局 官网上公开了所有的区域编码一年一更新。但只能在线查看没有提供完整数据库下载的连接。为此我编写了一个简陋的 python 脚本抓取了近几年的数据供大家下载。如果这里的下载成品中没有你需要的数据可以根据自己的要求修改脚本再运行起来去官网抓取即可。 特别说明本脚本使用的 python 版本为 3.12.2本脚本仅在 windows11 下验证通过未在 Linux 上验证过行政区划码的特点 编码是长度固定为12位的纯数字比如北京的编码 110000000000, 长度为12位并且全部为数字同时第1位数字不为0也就是说在数据库存储区位码时可以直接使用 number 类型而不必是 varchar。区划码共5个等级见下表 等级 行政级别 示例 1 省/直辖市 · 四川省 · 北京市 2 市 · 四川省/成都市 · 北京市/市辖区 3 区/县 · 四川省/成都市/武候区 · 陕西省/咸阳市/泾阳县 4 街道/乡镇 · 四川省/成都市/武候区/石羊街道 · 陕西省/咸阳市/泾阳县/永乐镇 5 社区/村委会 · 四川省/成都市/武候区/石羊街道/府城社区居委会 · 陕西省/咸阳市/泾阳县/永乐镇/磨子桥村委会各等级所占数字位数及开始位置如下四川省/成都市/武候区/石羊街道/府城社区居委会 ±—±—±—±----±---- | 51 | 01 | 07 | 063 | 009 | ----------------------成品下载 年份 3级数据 4级数据 5级数据 2023 共 3629 条(29.1K) 点击下载 共 4,4903 条(355K) 点击下载 共 66,4239 条(4.81M) 点击下载 2022 共 3634 条(29.2K) 点击下载 共 4,4907 条(355K) 点击下载 共 66,2725 条(4.79M) 点击下载 2021 共 3640 条(29.2K) 点击下载 共 4,4918 条(356K) 点击下载 敬请期待 2020 共 3644 条(29.4K) 点击下载 共 4,5180 条(360K) 点击下载 敬请期待 2019 共 3645 条(29.4K) 点击下载 共 4,6672 条(370K) 点击下载 敬请期待 通常下载后需要将数据保存到 MySql 数据库。假定你的 MySql 数据库信息如下 用户名root 密 码root 端 口3306 数据库名my_db 下载后的Sql文件位置为d:\admin_area_2023_level-4.sql则执行以下脚本将数据写入到 MySql mysql -uroot -proot -P3306 my_db D:\admin_area_2023_level-4.sql 根据实测情况抓取不同等级范围的数据耗时差别巨大详情如下3级数据3分钟左右4级数据30分钟左右5级数据8个小时以上Python 脚本 import requests from lxml import etree import pymysql import traceback import time# 关闭 https 相关的警告 requests.packages.urllib3.disable_warnings()# 国家统计局 (National Bureau Of Statistics) 行政区划数据抓取的主URL HOME_URL https://www.stats.gov.cn/sj/tjbz/tjyqhdmhcxhfdm/2023# 是否开启打印输出 ENABLE_PRINT False# 最大抓取深度最抓取到哪一个层级的区域数据总共5级 MAX_GRAB_LEVEL 4# 是否开启将数据写入到MySql ENABLE_MYSQL_INSERTION True# 遇到列值为 null 时是否跳过这条记录继续向下执行 SKIP_NULL_COLUMN_VALUE True# 抓取的最大数据条数主要用于调代码避免输出内容太多负数代表抓取所有 MAX_GRAB_COUNT -1# 当前正在处理的省份用于判断是否是直辖市 current_province_name None# 当前正在处理的城市名用于判断提交MySql时日志输出 current_city_name None# 连接MySql请根据实际情况修改 try:db pymysql.connect(hostlocalhost, userroot, passwdroot, port3306, dbmy_db)cursor db.cursor()print(连接Mysql成功) except:print(连接MySql失败)exitdef print_info(message:str):自定义一个内容输出方法主要目的是可以统一控制是否输出用于调试if ENABLE_PRINT:print(message) def insert_area_to_mysql(code:str, name:str, level:int, parent_code:str):插入一条记录到MySql但不提交参数code(str): 区域编码name(str): 区域名称level(int): 区域等级1: 省/直辖市2: 市3: 区/县4: 乡镇/街道5: 社区/村委会parent_code(str): 父级编码if not ENABLE_MYSQL_INSERTION:returnif code is None or name is None:print(发现null值code{}, name{}, level{}, parent_code{}.format(code, name, level, parent_code))if SKIP_NULL_COLUMN_VALUE:returnelse:db.close()print(插入到MySql时遇到 Null 列值程序将退出)exit()sql insert into admin_area_2023(code, name, level, parent_code) values ({}, {}, {}, {}).format(code, name, level, parent_code)sql sql.replace(None, NULL)print_info(sql)cursor.execute(sql)def commit_for_mysql():global db, current_province_nametry:db.commit()print(保存{}·{}行政区划数据到MySql成功.format(current_province_name, current_city_name))except Exception as e:db.rollback()print(保存 current_province_name 的行政区划数据到MySql失败)print(traceback.format_exc())def get_admin_area_html(url:str):try_count 0while try_count 3:try_count 1try:if try_count 1:time.sleep(0.1)# 第一次抓取失败elif try_count 2:time.sleep(1)else:time.sleep(2)response requests.get(url)response.encoding response.apparent_encodingreturn etree.HTML(response.text)except Exception:if try_count 3:print(traceback.format_exc())print(连续 {} 次抓取 {} 页面时发生错误, 将放弃本页面的数据抓取。可能被服务怀疑是爬虫拒绝了网络连接因此休息10秒.format(try_count, url))time.sleep(10)return Noneelse:print(第 {} 次抓取 {} 网页文本失败.format(try_count, url))def grap_all_provinces():抓取所有省份html get_admin_area_html(HOME_URL /index.html)province_nodes html.xpath(//*/tr[classprovincetr]/td/a)grabed_count 0for province_node in province_nodes:grabed_count 1province_city_link HOME_URL / province_node.attrib[href]province_code province_node.attrib[href][0:2] 0000000000province_name province_node.text.strip()global current_province_namecurrent_province_name province_nameprint_info(province_code{}, province_name{}.format(province_code, province_name))insert_area_to_mysql(province_code, province_name, 1, None)if MAX_GRAB_LEVEL 2:grab_province_cities(province_city_link, province_code, province_name)if MAX_GRAB_COUNT 0 and grabed_count MAX_GRAB_COUNT:breakdef grab_province_cities(province_city_link:str, province_code:str, province_name:str):抓取单个省/直辖市下的城市/区县参数:province_city_link(str): 省/直辖市区域页面的完整 urlprovince_code(str): 城市所属的省份编码province_name(str): 城市所属的省份名称print(开始抓取省份{}的城市列表, URL{}.format(province_name, province_city_link))html get_admin_area_html(province_city_link)if html is None:print(抓取省份{}的城市列表失败.format(province_name))returncityNodes html.xpath(//*/tr[classcitytr])grabed_count 0global current_city_namefor cityNode in cityNodes:link_nodes cityNode.xpath(./*/a)city_code link_nodes[0].textcity_name link_nodes[1].text.strip()current_city_name city_nameinsert_area_to_mysql(city_code, city_name, 2, province_code)print_info(city_code{}, city_name{}.format(city_code, city_name))if MAX_GRAB_LEVEL 3 and link_nodes[1].attrib.has_key(href):county_link province_city_link[0:province_city_link.rfind(/)] / link_nodes[1].attrib[href]grap_city_couties(county_link, city_code, city_name)# 以城市为最小提交单位commit_for_mysql()if MAX_GRAB_COUNT 0 and grabed_count MAX_GRAB_COUNT:breakdef grap_city_couties(city_county_link:str, city_code:str, city_name:str):抓取单个城市下的区/县参数:city_county_link(str): 城市区/县页面的完整 urlcity_code(str): 城市的编码city_name(str): 城市的名称print(开始抓取城市{}的区/县列表, URL{}.format(city_name, city_county_link))html get_admin_area_html(city_county_link)if html is None:print(抓取城市{}的区/县列表失败.format(city_name))returncounty_nodes html.xpath(//*/tr[classcountytr])grabed_count 0global current_province_namefor county_node in county_nodes:grabed_count 1county_link_nodes county_node.xpath(./*/a)if len(county_link_nodes) 0:# 没有a标签通常是直辖市的市辖区内容抓取方式不同county_code county_node.xpath(./td)[0].textcounty_name county_node.xpath(./td)[1].textinsert_area_to_mysql(county_code, county_name, 3, city_code)print_info(county_code{}, county_name{}, parent_code{}.format(county_code, county_name, city_code))else:county_code county_link_nodes[0].textcounty_name county_link_nodes[1].textinsert_area_to_mysql(county_code, county_name, 3, city_code)print_info(county_code{}, county_name{}, level2, parent_code {}.format(county_code, county_name, city_code))if MAX_GRAB_LEVEL 4 and county_link_nodes[1].attrib.has_key(href):town_link city_county_link[0:city_county_link.rfind(/)] / county_link_nodes[1].attrib[href]grap_county_towns(town_link, county_code, county_name)if MAX_GRAB_COUNT 0 and grabed_count MAX_GRAB_COUNT:breakdef grap_county_towns(county_town_link:str, county_code:str, county_name:str):抓取单个区/县下的乡镇/街道参数:county_town_link(str): 乡镇/街道数据页面完整的 urlcounty_code(str): 区/县的编码county_name(str): 区/县的名称print(开始抓取区县{}的街道/乡镇列表, URL{}.format(county_name, county_town_link))html get_admin_area_html(county_town_link)if html is None:print(抓取区县{}的街道/乡镇列表失败.format(county_name))returntown_nodes html.xpath(//*/tr[classtowntr])grabed_count 0for town_node in town_nodes:grabed_count 1village_link_nodes town_node.xpath(./*/a)town_code village_link_nodes[0].texttown_name village_link_nodes[1].textprint_info(town_code{}, town_name{}.format(town_code, town_name))insert_area_to_mysql(town_code, town_name, 4, county_code)if MAX_GRAB_LEVEL 5 and village_link_nodes[1].attrib.has_key(href):village_link county_town_link[0:county_town_link.rfind(/)] / village_link_nodes[1].attrib[href]grap_town_villages(village_link, town_code, town_name)if MAX_GRAB_COUNT 0 and grabed_count MAX_GRAB_COUNT:breakdef grap_town_villages(town_village_url:str, town_code:str, town_name:str):抓取单个街道/乡镇下的社区/村委会参数:town_village_url(str): 社区/村委会数据页面完整的 urltown_code(str): 街道/乡镇的编码town_name(str): 街道/乡镇的名称print_info(开始抓取街道/乡镇下{}的社区/村委会列表, URL{}.format(town_name, town_village_url))html get_admin_area_html(town_village_url)if html is None:print(抓取街道/乡镇下{}的社区/村委会列表失败.format(town_name))returnvillage_nodes html.xpath(//*/tr[classvillagetr])grabed_count 0for village_node in village_nodes:grabed_count 1village_info_columns village_node.xpath(./td)village_code village_info_columns[0].textvillage_name village_info_columns[2].textinsert_area_to_mysql(village_code, village_name, 5, town_code)print_info(village_code{}, village_code{}.format(village_code, village_name))if MAX_GRAB_COUNT 0 and grabed_count MAX_GRAB_COUNT:break# 正式执行数据抓取任务 grap_all_provinces()db.close()如何运行 下载 Window版Python 的安装程序并在本机安装如果你打算在 Linux 下运行这个程序你也可以直接下载 Linux 版本的 python但我还没在 Linux 环境下验证过这个脚本打开命令行窗口依次执行以下脚本以安装本脚本的依赖库pip install requests pip install lxml pip install pymysql 安装 MySql 服务器并创建好相应的表 你需要在本机上安装 MySql 数据库并创建用于存储区划码数据的表。建表语句如下 CREATE TABLE admin_area_2023 ( code char(12) NOT NULL COMMENT ‘区域编码’, name varchar(60) NOT NULL COMMENT ‘区域名称’, level tinyint(4) NOT NULL COMMENT ‘区域等级\r\n1 : 省/直辖市\r\n2 : 市\r\n3 : 区/县\r\n4 : 乡镇/街道\r\n5 : 社区/村委会’, parent_code char(12) DEFAULT NULL COMMENT ‘父级区域编码’, PRIMARY KEY (code) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; 根据实际情况修改脚本 一般来说你需要修改以下几项参数 要抓取哪一年的数据。搜索 HOME_URL 即可找到代码所在行连接 MySql 的用户名、密码、端口、数据库名称。搜索 pymysql.connect 即可找到代码所在行修改SQL语句设置要插入的表名。搜索 insert into 即可找到代码所在行设置要抓取的数据等级默认为4级。搜索 MAX_GRAB_LEVEL 即可找到代码所在行还支持一些其它的冷门设置就请自行阅读源码吧。 运行脚本 假设本机的 python 脚本命名为 admin-area-data-spider.py, 且位于 D 盘根目录则执行以下命令运行程序 python d:\admin-area-data-spider.py这是我花了一上午时间利用网友分享的 python 知识临时编写的脚本。但由于之前从没有接触过 python因此代码质量无法保障请各位老鸟见量。可以确保的是它当前在 windows 下是可以工作的。不过通过这次临时的 python 体验后非常喜欢这门语言用它来快速开发各种工具和快速构建原型项目以验证业务可行性是两个很不错的应用领域。当然它当前在科学计算和人工智能领域的应用更广泛。
http://www.pierceye.com/news/403658/

相关文章:

  • 重庆网站开发商城最近新闻有哪些
  • 电商网站设计线路图有哪些网络推广平台
  • 海门市建设局网站科技与应用
  • 北京做网站s免费做app网站有哪些
  • 免费制作网页的网站网络营销师报名官网
  • 长沙网站制作好公司网络服务模型
  • 网站开发的时间流程微信平台可以做微网站吗
  • 镇江网站seo天猫网店代运营
  • 吴江城乡住房和城乡建设局网站怎么给别人做网站优化
  • 名师工作室网站建设 意义网站图片上浮动文字
  • 做co的网站商城网站不备案
  • 黄山建设网站公司电话网站下载链接怎么做
  • 开发企业网站多少钱电视剧排行榜百度搜索风云榜
  • 什么网站做软文装修公司报价如何计算
  • 网站开发免费视频播放器应用公园app免费制作
  • 道路建设去什么网站能看到做内贸注册什么网站
  • 代理东莞网站制作公司wordpress前台用户中心代码
  • 做拼团网站下载wap浏览器
  • 网站建设合同文百科阿里云加WordPress建站
  • 服装购物网站排名ppt制作神器
  • 长沙营销策划公司排名如何优化企业网站
  • 北京制卡厂家做卡公司北京制卡网站_北京制卡_北京 去114网wordpress 关闭注册
  • 网站建设技术优势广州天河区医院
  • python和php网站开发中国十大公司排行榜
  • 网站栅格如何建设一个外卖订餐平台网站
  • 浙江省网站建设报价群晖wordpress不成功
  • 音乐网站制作策划书网站建设公司的服务公司
  • 南昌定制网站开发多少钱手机在线网页制作
  • 无锡网站推广$做下拉去118cr高端网站建设苏州
  • 该网站未在腾讯云备案网页界面图