zoukankan      html  css  js  c++  java
  • Java学习-056-Jsoup爬虫获取中国所有的三级行政区划数据(一)

      在涉及地址服务时,经常需要用到地址信息的获取,而行政区划可能不定期的发生变化,所以我们需要获取最新的行政区划信息。因行政区划数据量较大,Java中可以使用Jsoup进行数据的获取、处理。

    大家经常用到的行政区划数据,可从中华人民共和国民政部网站上获取,响应请求链接如下所示:

    http://www.mca.gov.cn/article/sj/xzqh/2019/

    界面如下图所示:

    截至当前对应的行政区划数据请求链接为:http://www.mca.gov.cn/article/sj/xzqh/2019/201901-06/201904301706.html ,对应的页面显示如下所示:

     

    通过观察中华人民共和国县以上行政区划代码的列表中可以看出行政区划代码基本规则:

    1. 行政区划代码若为非 “00” 结尾,可将区划级别视为 三级;
    2. 行政区划代码若为 “00” 结尾,可将区划级别视为 二级;
    3. 行政区划代码若为 “0000” 结尾,可将区划级别视为 一级;

      页面部分源码如下所示:

      

      可知:行政区划代码数据存储在 table 中,表格的第二列存放“行政区划代码”,表格的第三列存放“单位名称”;

      爬取思路如下:

      1、获取响应结果的 dom 树;

      2、获取所有的行标签;

      3、便利所有的列标签,获取拥有三个以上子列的行信息,并取第 2 列和第 3 列;

      4、依据行政区划代码基本规则,进行数据的标示;

      5、输出获得的行政区划数据,此处输出为 SQL 插入语句。

       

      源代码如下所示:

    @Test
    public void getRegionSql () throws Exception {
        String url = "http://www.mca.gov.cn/article/sj/xzqh/2019/201901-06/201904301706.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/xmlq=0.9,image/webp,image/apng,*/*q=0.8,application/signed-exchangev=b3")
                .maxBodySize(0)
                .timeout(100000)
                .get();
    
        Elements trs = doc.select("tr");
    
        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 leveType = 2;
            
                    parentCode = regionCode.substring(0,2) + "0000";
    
                    if (!regionCode.endsWith("00")) {
                        leveType = 3;
                        parentCode = regionCode.substring(0,4) + "00";
                    }
    
                    if (regionCode.endsWith("0000")) {
                        leveType = 1;
                        parentCode = "000000";
                    }
    
                    count++;
                    String content = String.format("insert into region_code (code, name, level, parent_code, dtime, note, ctime)" +
                            " values (%s, '%s', %s, %s, '201903', '系统生成', NOW());" + System.getProperty("line.separator"), regionCode, regionArea, leveType, parentCode);
            
            System.out.println(content);
                }
            }
        }
    
        System.out.println("总数量为:" + count);
    }
    
    
  • 相关阅读:
    10 种保护 Spring Boot 应用的绝佳方法
    Redis 如何分析慢查询操作?
    Spring Boot 主类及目录结构介绍
    Redis 再牛逼,也得设置密码!!
    Spring Data Redis 详解及实战一文搞定
    Spring Boot Redis Cluster 实战干货
    超详细的 Redis Cluster 官方集群搭建指南
    Redis Linux 安装运行实战全记录
    hdu 4790 Just Random (思路+分类计算+数学)
    poj 1328 Radar Installation(贪心)
  • 原文地址:https://www.cnblogs.com/fengpingfan/p/10875230.html
Copyright © 2011-2022 走看看