Java爬虫获取省市区镇村5级行政区划

        公司有个项目需要五级行政区划,没有现成的数据,写了一段代码,从gj统计j获取的数据。记录一下。

1.引入maven解析html

<!-- jsoup -->
<dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.11.3</version>
</dependency>

2.Java代码实现

@GetMapping("/hh")public void hh(){Division d=new Division();final String url = "https://www.stats.gov.cn/sj/tjbz/tjyqhdmhcxhfdm/2023/";String provinceurl = "https://www.stats.gov.cn/sj/tjbz/tjyqhdmhcxhfdm/2023/index.html"; // 需要爬取的目标网站地址try {Document document = Jsoup.connect(provinceurl).get(); // 获取该网页的文档对象String title = document.title(); // 获取页面标题//省Elements provincetable=document.body().select("tr.provincetr").select("a[href]");for (Element province : provincetable) {String provinceHref = province.attr("href"); // 获取链接地址String provinceText = province.text(); // 获取链接文字d.setProvincialCode(provinceHref.replace(".html",""));d.setProvincialName(provinceText);String cityurl=url+provinceHref;//System.out.println("cityurl = " + cityurl);Document citytabledocument = Jsoup.connect(cityurl).get();//市Elements citytable=citytabledocument.body().select("table.citytable").select("a[href]");//System.out.println("citytable = " + citytable);for(int i=0;i<citytable.size()/2;i++){d.setMunicipalCode(citytable.get(i).text());i=i+1;d.setMunicipalName(citytable.get(i).text());String cityHref = citytable.get(i).attr("href"); // 获取链接地址String countyurl=url+cityHref;System.out.println("countyurl = " + countyurl);Document countytableocument = Jsoup.connect(countyurl).get();//区Elements countytable=countytableocument.body().select("table.countytable").select("a[href]");for(int j=0;j<countytable.size()/2;j++){d.setDistrictCode(countytable.get(j).text());j=j+1;d.setDistrictName(countytable.get(j).text());String countyHref = countytable.get(j).attr("href"); // 获取链接地址String townturl = url + provinceHref.replace(".html", "") + "/" + countyHref;Document townttableocument = Jsoup.connect(townturl).get();//镇Elements towntable = townttableocument.body().select("table.towntable").select("a[href]");for(int k=0;k<towntable.size()/2;k++){d.setStreetTownCode(towntable.get(k).text());k=k+1;d.setStreetTownName(towntable.get(k).text());String towntHref = towntable.get(k).attr("href"); // 获取链接地址String villageurl = townturl.substring(0, townturl.length() - 11) + towntHref;System.out.println("villageurl = " + villageurl);Document villagetabledocument = Jsoup.connect(villageurl).get();//村Elements villagetable = villagetabledocument.body().select("table.villagetable").select("tr.villagetr");for (Element village : villagetable) {String villageText = village.text(); // 获取链接文字String[] vi = villageText.split(" ");System.out.println("统计用区划代码: " + vi[0]);System.out.println("城乡分类代码: " + vi[1]);System.out.println("名称: " + vi[2]);d.setCommunityVillageCode(vi[0]);d.setUrbanRural( vi[1]);d.setCommunityVillageName(vi[2]);System.out.println("d.toString() = " + d.toString());System.out.println("vi = " + vi);divisionService.insertDivision1(d);}//我想让他跑慢点,你可以自己调try {Thread.sleep(2000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}}}} catch (IOException e) {e.printStackTrace();}}

3.用到的实体类

import com.ruoyi.common.utils.StringUtils;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;/*** 行政区划对象 division** @author liphui* @date 2023-11-17*/
public class Division extends BaseEntity
{private static final long serialVersionUID = 1L;/** 省级代码 */@Excel(name = "省级代码")private String provincialCode;/** 省级名称 */@Excel(name = "省级名称")private String provincialName;/** 市级代码 */@Excel(name = "市级代码")private String municipalCode;/** 市级名称 */@Excel(name = "市级名称")private String municipalName;/** 区县代码 */@Excel(name = "区县代码")private String districtCode;/** 区县名称 */@Excel(name = "区县名称")private String districtName;/** 街镇乡代码 */@Excel(name = "街镇乡代码")private String streetTownCode;/** 街镇乡名称 */@Excel(name = "街镇乡名称")private String streetTownName;/** 社区村级代码 */@Excel(name = "社区村级代码")private String communityVillageCode;/** 社区村级名称 */@Excel(name = "社区村级名称")private String communityVillageName;/** 城乡分类 */@Excel(name = "城乡分类")private String urbanRural;public void setProvincialCode(String provincialCode){this.provincialCode = provincialCode;}public String getProvincialCode(){return provincialCode;}public void setProvincialName(String provincialName){this.provincialName = provincialName;}public String getProvincialName(){return provincialName;}public void setMunicipalCode(String municipalCode){this.municipalCode = municipalCode;}public String getMunicipalCode(){return municipalCode;}public void setMunicipalName(String municipalName){this.municipalName = municipalName;}public String getMunicipalName(){return municipalName;}public void setDistrictCode(String districtCode){this.districtCode = districtCode;}public String getDistrictCode(){return districtCode;}public void setDistrictName(String districtName){this.districtName = districtName;}public String getDistrictName(){return districtName;}public void setStreetTownCode(String streetTownCode){this.streetTownCode = streetTownCode;}public String getStreetTownCode(){return streetTownCode;}public void setStreetTownName(String streetTownName){this.streetTownName = streetTownName;}public String getStreetTownName(){return streetTownName;}public void setCommunityVillageCode(String communityVillageCode){this.communityVillageCode = communityVillageCode;}public String getCommunityVillageCode(){return communityVillageCode;}public void setCommunityVillageName(String communityVillageName){this.communityVillageName = communityVillageName;}public String getCommunityVillageName(){return communityVillageName;}public void setUrbanRural(String urbanRural){this.urbanRural = urbanRural;}public String getUrbanRural(){return urbanRural;}public String getDivisionName(){StringBuilder stringBuilder = new StringBuilder();if (StringUtils.isNotEmpty(this.provincialName)){stringBuilder.append(this.provincialName);}else {return stringBuilder.toString();}if (StringUtils.isNotEmpty(this.municipalName)){stringBuilder.append(",").append(this.municipalName);}else {return stringBuilder.toString();}if (StringUtils.isNotEmpty(this.districtName)){stringBuilder.append(",").append(this.districtName);}else {return stringBuilder.toString();}if (StringUtils.isNotEmpty(this.streetTownName)){stringBuilder.append(",").append(this.streetTownName);}else {return stringBuilder.toString();}if (StringUtils.isNotEmpty(this.communityVillageName)){stringBuilder.append(",").append(this.communityVillageName);}else {return stringBuilder.toString();}return stringBuilder.toString();}public String getDivisionCode(){StringBuilder stringBuilder = new StringBuilder();if (StringUtils.isNotEmpty(this.provincialCode)){stringBuilder.append(this.provincialCode);}else {return stringBuilder.toString();}if (StringUtils.isNotEmpty(this.municipalCode)){stringBuilder.append(",").append(this.municipalCode);}else {return stringBuilder.toString();}if (StringUtils.isNotEmpty(this.districtCode)){stringBuilder.append(",").append(this.districtCode);}else {return stringBuilder.toString();}if (StringUtils.isNotEmpty(this.streetTownCode)){stringBuilder.append(",").append(this.streetTownCode);}else {return stringBuilder.toString();}if (StringUtils.isNotEmpty(this.communityVillageCode)){stringBuilder.append(",").append(this.communityVillageCode);}else {return stringBuilder.toString();}return stringBuilder.toString();}@Overridepublic String toString() {return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE).append("provincialCode", getProvincialCode()).append("provincialName", getProvincialName()).append("municipalCode", getMunicipalCode()).append("municipalName", getMunicipalName()).append("districtCode", getDistrictCode()).append("districtName", getDistrictName()).append("streetTownCode", getStreetTownCode()).append("streetTownName", getStreetTownName()).append("communityVillageCode", getCommunityVillageCode()).append("communityVillageName", getCommunityVillageName()).append("urbanRural", getUrbanRural()).toString();}
}

其他的代码不贴了,就是数据入库。

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

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

相关文章

Liunx JBK、Python安装和SSH免密登陆

一. JBK的安装 https://www.cnblogs.com/javabg/p/10332993.html 1.查找java相关的列表&#xff1a; yum -y list java* 或 yum search jdk 2.安装JBK&#xff1a; yum install java-11-openjdk.x86_64 yum install java-11-openjdk-devel.x86_64 3.完成安装后验…

Spring+Vue实战项目环境准备跑通程序

SpringVue 源项目 后端&#xff1a; 首先在GitHub上克隆项目到本地&#xff08;zip包下载/sourcetree拉取/gitbash克隆&#xff09;。 https://github.com/songboriceman/doubao_community_backend 然后下载Lombok安装到你的IDE&#xff08;eclipse&#xff09;。 https://p…

2022年多元统计分析期末试题

2023年多元统计分析期末试题 1.试论述系统聚类、动态聚类和有序聚类的异同之处。 2、设 X {X} X~ N 3 {N_3} N3​(μ&#xff0c;Σ)&#xff0c;其中 X {X} X ~ ( X 1 {X_1} X1​, X 2 {X_2} X2​, X 3 {X_3} X3​)&#xff0c;μ (1,-2,3)‘&#xff0c;Σ [ 1 1 1 1 3 2…

ThinkPHP5多小区物业管理系统源码(支持多小区)

基于 ThinkPHP5 Bootstrap 倾力打造的多小区物业 管理系统源码&#xff0c;操作简单&#xff0c;功能完善&#xff0c;用户体验良好 开发环境PHP7mysql 安装步骤: 1.新建数据库db_estate,还原数据db_estate.sql 2.修改配置文件&#xff1a;application/database.php 3.运…

《C++语言程序设计(第5版)》(清华大学出版社,郑莉 董渊编著)习题——第2章 C++语言简单程序设计

2-15 编写一个程序&#xff0c;运行时提示输入一个数字&#xff0c;再把这个数字显示出来。 #include <iostream>using namespace std;int main() {// 提示用户输入数字cout << "请输入一个数字: ";// 用于存储用户输入的数字的变量double number;// 从…

FineBI实战(2):案例架构说明及数据准备

1 系统架构 基于MySQL搭建数据仓库基于Kettle进行数据处理帆软FineBI基于MySQL搭建的数据仓库进行数据分析 2 数据流程图 通过Kettle将MySQL业务系统数据库中&#xff0c;将数据抽取出来&#xff0c;然后装载到MySQL数据仓库中。编写SQL脚本&#xff0c;对MySQL数据仓库中的数…

LeetCode 2807. 在链表中插入最大公约数【链表,迭代,递归】1279

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

XXL-JOB学习笔记-新增企业微信告警通知

xxl-job默认的告警通知方式是发送邮件&#xff0c;工作中不易及时的收到通知并作出响应&#xff0c;所以想要调整下告警的通知方式&#xff0c;查阅文档资料&#xff0c;发现可以扩展xxl-job的源码实现支持。 主要思路就是根据xxl-job现有的告警机制&#xff0c;扩展实现企业微…

浅谈Java 微服务技术:理论与实践

目录 1. 引言 2. 什么是微服务架构&#xff1f; 2.2 微服务的优势 3. 微服务架构的设计原则 3.1 单一职责原则 3.2 服务自治原则 3.3 去中心化原则 4. 微服务通信方式 4.1 RESTful API 4.2 消息队列 5. 服务注册与发现 6. 微服务容器化与Docker 7. 微服务监控与日志…

SQL注入总结

又到了期末时间段&#xff0c;此文章是自己总结所学&#xff0c;仅供参考。 目录&#xff1a; 一、原理 一般流程 二、分类 按照请求分类 盲注分类 按照头部字段 其他类型 三、防御 代码层面 网络层面 一、原理&#xff1a; 后端web服务器对用户输入的恶意字符过滤不严&am…

数据结构和算法-交换排序中的快速排序(演示过程 算法实现 算法效率 稳定性)

文章目录 总览快速排序&#xff08;超级重要&#xff09;啥是快速排序演示过程算法实现第一次quicksort函数第一次partion函数到第一次quicksort的第一个quicksort到第二次quicksort的第一个quicksort到第二次quicksort的第二个quicksort到第一次quicksort的第二个quicksort到第…

Java反射和动态代理

文章目录 1、反射1.1 反射的概述1.2 反射作用1.3 获取字节码文件对象的方式1.4 字节码文件和字节码文件对象1.5 获取构造方法1.6 获取构造方法并创建对象1.7 获取成员变量并获取值和修改值1.8 获取成员方法1.9 获取成员方法并运行1.10 反射练习1.10.1 泛型擦除1.10.2 修改字符串…

uniapp 创建组件组件

组件&#xff1a;用于将某个功能的 HTML、CSS、JS 封装到一个文件中&#xff0c;提高代码的复用性和可维护性。 创建组件 一、在根目录中创建 components 文件夹&#xff0c;右键点击新建组件。 二、输入组件名称、选择默认模板、点击创建组件。 三、在组件中正常编写内容即可…

动态编译 - Dynamically Compile and Load External Java Classes

文章目录 概述Code 概述 动态编译和加载外部Java类的核心流程可以概括为以下几个步骤&#xff1a; 读取源代码: 首先&#xff0c;需要获取到外部的Java源代码。这通常是通过读取文件、网络资源或者数据库中的源代码字符串来实现的。编译源代码: 接下来&#xff0c;需要使用Ja…

计算机网络(8):因特网上的音频/视频服务

概述 计算机网络最初是为传送数据设计的。因特网 IP 层提供的 “尽最大努力交付” 服务以及每一个分组独立交付的策略&#xff0c;对传送数据信息十分合适。因特网使用的 TCP 协议可以很好地解决P层不能提供可靠交付这一问题。 音频/视频常称为多媒体信息 多媒体信息&#xff…

unity 安卓 TCP可以连接别人,但是作为服务器无法被连接

现象非常的奇特&#xff0c;电脑ping手机没问题&#xff0c;用手机的socket调试助手也没问题&#xff0c;手机还能向外连接tcp服务器&#xff0c;但是电脑连手机tcp服务器连不上。更有趣的是&#xff0c;有些手机做tcp服务器可以被连接&#xff0c;有些手机做tcp服务器不能被连…

容器相关笔记

1.容器 1.什么是容器 容器就是存放对象的集合 2.java中的容器 容器就是一系列的类或接口&#xff0c;用来存储一系列对象的地址 3.容器里存放的是引用数据类型&#xff08;存对象的地址&#xff0c;不是对象本身&#xff09;&#xff0c;不能存基本数据类型 4.容器存放的两种格…

【BIAI】lecture 3 - GD BP CNN Hands-on

GD & BP & CNN & Hands-on 专业术语 gradient descent (GD) 梯度下降 back propagation (BP) 向传播 Convolutional Neural Network (CNN) 卷积神经网络 forward propagation 前向传播 biologically symmetry 生物对称性 synaptic 突触 axon 轴突 课程大纲 The go…

BUUCTF crypto做题记录(6)新手向

一、Unencode 得到的密文&#xff1a;89FQA9WMD<V1A<V1S83DY.#<W3$Q,2TM] 看题目名字&#xff0c;我们可以知道这是一个解码的题目&#xff0c;但是unencode 好像是不可解码的意思&#xff0c;我们可以对照着解码方式看一下哪个更适合&#xff0c;可以进行尝试一下C…

Linux系统操作——重启oracle服务:监听器和实例

目录 一、重启Oracle数据库及监听器 【方法一】 【方法二】 【方法三】 二、查看oracle监听状态 三、重启实例 一、重启Oracle数据库及监听器 【方法一】 获取root权限 su root 进入oracle的安装目录 cd $ORACLE_HOME 重启数据库 dbstart 重启监听器 lsnrctl st…