中国行政区划数据获取

文章目录


前言

为了示范,我将给出一个完整的Java示例,展示如何使用Jsoup库抓取中华人民共和国民政部网站上的行政区划信息,并将其解析为结构化的SQL插入语句。以下代码可以作为你实现这个功能的参考。


提示:以下是本篇文章正文内容,下面案例可供参考

Java代码示例

步骤1:添加依赖项
如果你使用Maven,请在pom.xml文件中添加Jsoup依赖项:

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.14.3</version>
</dependency>

步骤2:编写Java代码
以下是完整的Java代码,用于抓取和解析行政区划信息,并生成SQL插入语句:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import javax.net.ssl.*;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;

public class RegionSqlGenerator {

    public void getRegionSql() throws Exception {
        SSLUtilities.disableSSLVerification();
        String url = "https://www.mca.gov.cn/mzsj/xzqh/2023/202301xzqh.html";
        int count = 0;

        Document doc = Jsoup.connect(url)
                .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36")
                .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3")
                .maxBodySize(0)
                .timeout(100000)
                .get();

        Elements trs = doc.select("tr");

        StringBuilder sqlBuilder = new StringBuilder();

        for (Element tr : trs) {
            Elements tds = tr.select("td");

            if (tds.size() > 3) {
                String regionCode = tds.get(1).text();
                String regionArea = tds.get(2).text();
                String parentCode = "";

                if (validCode(regionCode)) {
                    int levelType = 2;

                    parentCode = regionCode.substring(0, 2) + "0000";

                    if (!regionCode.endsWith("00")) {
                        levelType = 3;
                        parentCode = regionCode.substring(0, 4) + "00";
                    }

                    if (regionCode.endsWith("0000")) {
                        levelType = 1;
                        parentCode = "000000";
                    }

                    count++;
                    String sql = String.format("INSERT INTO region_code (code, name, level, parent_code, dtime, note, ctime) " +
                                    "VALUES ('%s', '%s', %d, '%s', '201903', '系统生成', NOW());%s",
                            regionCode, regionArea, levelType, parentCode, System.lineSeparator());

                    sqlBuilder.append(sql);
                }
            }
        }

        writeToFile(sqlBuilder.toString(), "region_code.sql");
        System.out.println("总数量为:" + count);
    }

    private boolean validCode(String code) {
        // 验证代码是否有效,例如长度是否为6,且只包含数字
        return code.matches("\\d{6}");
    }

    private void writeToFile(String content, String fileName) {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName))) {
            writer.write(content);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        try {
            new RegionSqlGenerator().getRegionSql();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

/**
 * 禁用SSL验证
 *
 */
class SSLUtilities {
    public static void disableSSLVerification() {
        try {
            TrustManager[] trustAllCertificates = new TrustManager[]{
                    new X509TrustManager() {
                        public X509Certificate[] getAcceptedIssuers() {
                            return null;
                        }

                        public void checkClientTrusted(X509Certificate[] certs, String authType) {
                        }

                        public void checkServerTrusted(X509Certificate[] certs, String authType) {
                        }
                    }
            };

            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, trustAllCertificates, new SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());

            HostnameVerifier allHostsValid = new HostnameVerifier() {
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            };

            HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这里插入图片描述

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
根据提供的代码和结果,可以看出这段Java代码是通过经纬度获取行政区划的功能。代码中使用了百度地图的API来实现这个功能。首先,代码中定义了一个私有方法`getTownByLonAndLat`,该方法接收经度和纬度作为参数,并返回一个JSON对象,该对象包含了获取到的行政区划信息。在方法内部,首先创建了一个`Map`对象来存储请求参数,然后设置了一些必要的参数,如百度开放平台的API Key、输出格式为JSON、返回乡镇级数据等。接下来,将经纬度添加到参数中,并构建了请求URL。最后,通过调用`HttpUtil.getResult`方法发送HTTP请求,并将返回的结果解析为JSON对象。最终,从JSON对象中获取到了行政区划信息,并返回。 根据提供的运行结果,可以看出该方法成功获取到了行政区划信息。结果中包含了国籍、国家代码、省份、省份代码、城市和城市代码等信息。根据结果,经纬度所对应的行政区划中国广西壮族自治区贺州市。 因此,这段Java代码可以通过经纬度获取行政区划信息。\[1\]\[2\] #### 引用[.reference_title] - *1* [Java 根据百度经纬度(坐标) 获取中国街道、街道编码](https://blog.csdn.net/qq_32407233/article/details/121395724)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Java实现通过经纬度调用腾讯地图接口获取行政地区信息](https://blog.csdn.net/qq_26383975/article/details/108868061)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搬砖的小熊猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值