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);
    }
    
    
  • 相关阅读:
    [转帖]gesture recognition
    [转帖]了解AmbiLight知识
    [转帖]AVS音视频编解码技术了解
    [笔记]新概念英语听力
    ES 学习记录
    Spring Aop 错误之:No MethodInvocation found ... the ExposeInvocationInterceptor is upfront in the interceptor chain. Specifically, note that advices with order HIGHEST
    AOP无法切入同类调用方法解决办法
    多数据源 Spring 1.x 和 spring 2.x区别
    Intellij IDEA 在一个窗口添加多个项目并全部加入version control
    PageHelper 分页和排序之间的关系
  • 原文地址:https://www.cnblogs.com/fengpingfan/p/10875230.html
Copyright © 2011-2022 走看看