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

news2024/11/18 19:58:07

        公司有个项目需要五级行政区划,没有现成的数据,写了一段代码,从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();
    }

    @Override
    public 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.coloradmin.cn/o/1371550.html

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

相关文章

nextjs + ahooks 报错 Cannot use import statement outside a module

在 nextjs 中使用 ahooks 时&#xff0c;报错 SyntaxError: Cannot use import statement outside a module&#xff0c;如下图所示&#xff1a; 解决方案 transpilePackages 官网介绍 Next.js can automatically transpile and bundle dependencies from local packages (lik…

MT36291 2.5A 高效的1.2MHz电流模式升压转换器 DCDC管理芯片 航天民芯

描述 MT36291是一个恒定频率、6引脚SOT23电流模式升压转换器&#xff0c;旨在用于小型、低功耗的应用。MT36291的开关频率为1.2MHz&#xff0c;并允许使用2mm或更低高度的微小、低成本的电容器和电感器。内部软启动导致注入电流小&#xff0c;延长电池寿命。MT36291的特点是在光…

Linux 常用指令汇总

Linux 常用指令汇总 文章目录 Linux 常用指令汇总[toc]前言一、文件目录指令pwd 指令ls 指令cd 指令mkdir 指令rmdir 指令tree 指令cp 指令rm 指令mv 指令cat 指令more 指令less 指令head 指令tail 指令echo 指令> 指令>> 指令 二、时间日期指令date 指令cal 指令 三、…

20240110在ubuntu20.04下重启samba服务

20240110在ubuntu20.04下重启samba服务 百度搜索&#xff1a;samba restart https://www.python100.com/html/78028.html 重启samba命令详解 更新&#xff1a;2023-05-17 16:04 一、重启samba命令 重启samba可以使用以下命令&#xff1a; /etc/init.d/smb restart 或者 syste…

探索AI技术的奥秘:揭秘人工智能的核心原理

目录 前言 学习AI要看的第一本书 人工智能应当以人为本 史蒂芬卢奇&#xff08;Stephen Lucci&#xff09; 萨尔汗M穆萨&#xff08;Sarhan M . Musa&#xff09; 丹尼科佩克&#xff08;Danny Kopec&#xff09;&#xff08;已故&#xff09; 通晓六点&#xff0c;明白…

IPV6学习记录

IPV6的意义 从广义上来看IPV6协议包含的内容很多: IPV6地址的生成与分配 IPV6的报头的功能内容 IPV4网络兼容IPV6的方案 ICMPv6的功能(融合了arp和IGMP功能) IPV6的路由方式 ipv6的诞生除了由于ipv4的地址枯竭外&#xff0c;很大程度上也是因为ipv4多年的发展产生了很多…

网络的设置

一、网络设置 1.1查看linux基础的网络设置 网关 route -n ip地址ifconfigDNS服务器cat /etc/resolv.conf主机名hostname路由 route -n 网络连接状态ss 或者 netstat域名解析nslookup host 例题&#xff1a;除了ping&#xff0c;什么命令可以测试DNS服务器来解…

Python 与 PySpark数据分析实战指南:解锁数据洞见

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 数据分析是当今信息时代中至关重要的技能之一。…

Blazor 错误笔记

1. 运行时问题 Microsoft.NETCore.App.Runtime.Mono.browser-wasm Microsoft.NETCore.App.Runtime.Mono.browser-wasm 是一个 .NET Core 运行时的包&#xff0c;用于在浏览器中运行 .NET Core 应用程序。它是针对 WebAssembly 架构的 .NET Core 运行时&#xff0c;可以在浏览…

自动修复vcruntime140.dll丢失的解决办法,快速解决dll文件问题

在使用电脑时也会有不少用户都遇到vcruntime140.dll丢失的情况&#xff0c;那么有什么办法可以解决vcruntime140.dll丢失呢&#xff1f;今天将给大家分享一些关于vcruntime140.dll丢失的解决办法&#xff0c;从自动修复和手动修复两个方向给大家分析希望能够帮助到大家。 一.vc…

Phoenix基本使用

1、Phoenix简介 1.1 Phoenix定义 Phoenix是HBase的开源SQL皮肤。可以使用标准JDBC API代替HBase客户端API来创建表&#xff0c;插入数据和查询HBase数据。 1.2 Phoenix特点 容易集成&#xff1a;如Spark&#xff0c;Hive&#xff0c;Pig&#xff0c;Flume和Map Reduce。性能…

51-6 Vision Transformer ,ViT 论文精读

李沐&#xff08;沐神&#xff09;、朱毅讲得真的好&#xff0c;干货蛮多&#xff0c;值得认真读很多遍&#xff0c;甚至可以当成多模态大模型基础课程学习。 论文原文: An image is worth 16x16 words: transformers for image recognition at scale。 ViT取代了CNN&#xf…

给大家带来三个图片格式转换工具以及步骤

在处理图片时&#xff0c;我们经常需要将图片格式转换为JPG格式。JPG格式是一种常见的图片格式&#xff0c;它具有较好的压缩效果和兼容性&#xff0c;适用于各种不同的应用场景。下面将介绍如何将图片格式转换为JPG格式。 方法一&#xff1a;水印云工具 1. 打开我们的软件。…

Q-BENCH: A BENCHMARK FOR GENERAL-PURPOSEFOUNDATION MODELS ON LOW-LEVEL VISION

继续分享Q系列文章&#xff0c;今天分享Q-BENCH。 简单来说&#xff0c;作者对MLLMs在lowlevel领域中的评价提出了一个测试基准&#xff0c;主要分三点进行讲述。 有点类似于综述&#xff0c;显然作者团队在MLLM的lowlevel领域属于开山之作了。 第一个基准叫感知Perception 简…

朴素贝叶斯进行垃圾邮件分类的python简单示例实现

朴素贝叶斯&#xff08;Naive Bayes&#xff09;是一种基于贝叶斯定理的分类算法&#xff0c;它的核心思想是利用特征之间的独立性来简化分类问题。具体来说&#xff0c;朴素贝叶斯假设每个特征与其他特征之间是相互独立的&#xff0c;即每个特征对于分类结果的影响是相互独立的…

网络安全B模块(笔记详解)- Web渗透测试

Web渗透测试 1.通过渗透机Kali1.0对服务器场景PYsystem20192进行Web渗透测试(使用工具w3af的对目标Web服务器进行审计),在w3af的命令行界面下,使用命令列出所有用于审计的插件,将该操作使用的命令作为Flag值提交; 进入kali命令控制台中使用命令w3af_console进入w3af命令…

Java IO学习和总结(超详细)

一、理解 I/O 是输入和输出的简写&#xff0c;指的是数据在计算机内部和外部设备之间的流动。简单来说&#xff0c;当你从键盘输入数据、从鼠标选择操作&#xff0c;或者在屏幕上看到图像&#xff0c;这些都是 I/O 操作。它就像是计算机与外部世界沟通的桥梁&#xff0c;没有 I…

Zookeeper设计理念与源码剖析

Zookeeper 架构理解 整体架构 Follower server 可以直接处理读请求&#xff0c;但不能直接处理写请求。写请求只能转发给 leader server 进行处理。最终所有的写请求在 leader server 端串行执行。&#xff08;因为分布式环境下永远无法精确地确认不同服务器不同事件发生的先后…

【Flink精讲】Flink数据延迟处理

面试题&#xff1a;Flink数据延迟怎么处理&#xff1f; 将迟到数据直接丢弃【默认方案】将迟到数据收集起来另外处理&#xff08;旁路输出&#xff09;重新激活已经关闭的窗口并重新计算以修正结果&#xff08;Lateness&#xff09; Flink数据延迟处理方案 用一个案例说明三…

鸿蒙开发已解决-Failed to connect to gitee.com port 443: Time out 连接超时提示

文章目录 项目场景:问题描述原因分析:解决方案:解决方案1解决方案2:解决方案3:此Bug解决方案总结解决方案总结**心得体会:解决连接超时问题的三种方案**项目场景: 导入Sample时遇到导入失败的情况,并提示“Failed to connect to gitee.com port 443: Time out”连接超…