前言:

本文基于j2ee的原始url进行都写,解析指定内容时也是使用很傻的形式去查找指定格式的字符串来实现的。

更优雅的方式是可以使用apache的HttpClient和某些文档模型将HTML字符串构建成doc来进行解析。

爬取的原因:统计局网站提供的页面并按照:省-市-县-镇-村   这样的层次关系来组织页面,人工去获取所有的代码工作量大而繁琐,遂有了下面很粗糙的代码

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.charset.Charset;

/**
 * 从国家统计局网站爬取2013年12位到村级别的行政区划代码
 * @author 杨志龙
 * blog:http://www.cnblogs.com/yangzhilong
 *
 */
public class ReadCodeFromWeb {
    public static final String baseUrl = "http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2015/";
    //设置utf-8发现有部分字符有乱码
    public static final String CHARSET = "GBK";
    
    public static StringBuffer result = new StringBuffer();

/**
     * 读省的信息
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        String url = baseUrl + "index.html";
        //如果需要设置代理
        //initProxy("10.10.13.200", "80");
        String str = getContent(url).toUpperCase();
        String[] arrs = str.split("<A");

for (String s : arrs) {
            if (s.indexOf("HREF") != -1 && s.indexOf(".HTML") != -1) {
                
                String a = s.substring(7, s.indexOf("'>"));
                String name = s.substring(s.indexOf("'>")+2, s.indexOf("<BR/>"));
                System.out.println(name);
                if(!"云南省".equals(name)){
                    continue;
                }
                
                FileWriter fw = new FileWriter(new File("c:/"+name+".html"));
                BufferedWriter bw = new BufferedWriter(fw);
                
                bw.write("<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8' /></head><body><table border='1' bordercolor='#000000' style='border-collapse:collapse'><tr><td>代码</td><td>省</td><td>市</td><td>县</td><td>镇</td><td>城乡分类</td><td>村/街道</td></tr>");
                bw.newLine();
                bw.write("<tr><td></td><td>");
                bw.write(name);
                bw.write("</td><td></td><td></td><td></td><td></td><td></td></tr>");
                
                bw.newLine();
                
                System.out.println("爬取:"+name);
                
                readShi(a,bw);
                
                bw.newLine();
                bw.write("</table></body></html>");
                bw.flush();
                bw.close();
            }
        }
    }
    
    /**
     * 读市的数据
     * @param list
     * @throws Exception 
     */
    public static void readShi(String url,BufferedWriter bw) throws Exception{
        String content = getContent(baseUrl+url).toUpperCase();
        String[] citys = content.split("CITYTR");
        //'><TD><A HREF='11/1101.HTML'>110100000000</A></TD><TD><A HREF='11/1101.HTML'>市辖区</A></TD></td><TR CLASS='
        for(int c=1,len=citys.length; c<len; c++){
            String[] strs = citys[c].split("<A HREF='");
            String cityUrl = null;
            for(int si = 1; si<3; si++){
                if(si==1){//取链接和编码
                    cityUrl = strs[si].substring(0, strs[si].indexOf("'>"));
                    String cityCode = strs[si].substring(strs[si].indexOf("'>")+2, strs[si].indexOf("</A>"));
                    
                    bw.write("<tr><td>");
                    bw.write(cityCode);
                    bw.write("</td>");
                }else{
                    bw.write("<td></td><td>");
                    bw.write(strs[si].substring(strs[si].indexOf("'>")+2, strs[si].indexOf("</A>")));
                    bw.write("</td><td></td><td></td><td></td><td></td></tr>");
                    
                    System.out.println("爬取:"+strs[si].substring(strs[si].indexOf("'>")+2, strs[si].indexOf("</A>")));
                }
            }
            bw.newLine();
            readXian(cityUrl.substring(0, cityUrl.indexOf("/")+1),cityUrl,bw);
        }
    }
    
    /**
     * 读县的数据
     * @param url
     * @throws Exception 
     */
    public static void readXian(String prix,String url,BufferedWriter bw) throws Exception{
        String content = getContent(baseUrl+url).toUpperCase();
        String[] citys = content.split("COUNTYTR");
        for(int i=1; i<citys.length; i++){
            String cityUrl = null;
            
            //发现石家庄有一个县居然没超链接,特殊处理
            if(citys[i].indexOf("<A HREF='")==-1){
                bw.write("<tr><td>");
                bw.write(citys[i].substring(6, 18));
                bw.write("</td>");
                
                bw.write("<td></td><td></td><td>");
                bw.write(citys[i].substring(citys[i].indexOf("</TD><TD>")+9,citys[i].lastIndexOf("</TD>")));
                bw.write("</td><td></td><td></td><td></td></tr>");
            }else{
                String[] strs = citys[i].split("<A HREF='");
                for(int si = 1; si<3; si++){
                    if(si==1){//取链接和编码
                        cityUrl = strs[si].substring(0, strs[si].indexOf("'>"));
                        String cityCode = strs[si].substring(strs[si].indexOf("'>")+2, strs[si].indexOf("</A>"));
                        
                        bw.write("<tr><td>");
                        bw.write(cityCode);
                        bw.write("</td>");
                    }else{
                        bw.write("<td></td><td></td><td>");
                        bw.write(strs[si].substring(strs[si].indexOf("'>")+2, strs[si].indexOf("</A>")));
                        bw.write("</td><td></td><td></td><td></td></tr>");
                    }
                }
            }
            bw.newLine();
            if(null!=cityUrl){
                readZhen(prix,cityUrl,bw);
            }
        }
    }
    
    /**
     * 读镇的数据
     * @param url
     * @throws Exception 
     */
    public static void readZhen(String prix,String url,BufferedWriter bw) throws Exception{
        String content = getContent(baseUrl+prix+url).toUpperCase();
        String myPrix = (prix+url).substring(0, (prix+url).lastIndexOf("/")+1);
        String[] citys = content.split("TOWNTR");
        for(int i=1; i<citys.length; i++){
            String[] strs = citys[i].split("<A HREF='");
            String cityUrl = null;
            for(int si = 1; si<3; si++){
                if(si==1){//取链接和编码
                    cityUrl = strs[si].substring(0, strs[si].indexOf("'>"));
                    String cityCode = strs[si].substring(strs[si].indexOf("'>")+2, strs[si].indexOf("</A>"));
                    
                    bw.write("<tr><td>");
                    bw.write(cityCode);
                    bw.write("</td>");
                }else{
                    bw.write("<td></td><td></td><td></td><td>");
                    bw.write(strs[si].substring(strs[si].indexOf("'>")+2, strs[si].indexOf("</A>")));
                    bw.write("</td><td></td><td></td></tr>");
                }
            }
            bw.newLine();
            readCun(myPrix,cityUrl,bw);
        }
    }
    
    /**
     * 读村/街道的数据
     * @param url
     * @throws Exception 
     */
    public static void readCun(String prix,String url,BufferedWriter bw) throws Exception{
        String content = getContent(baseUrl+prix+url).toUpperCase();
        String[] citys = content.split("VILLAGETR");
        for(int i=1; i<citys.length; i++){
            String[] strs = citys[i].split("<TD>");
            
            bw.write("<tr><td>");
            bw.write(strs[1].substring(0, strs[1].indexOf("</TD>")));
            bw.write("</td>");
            
            bw.write("<td></td><td></td><td></td><td></td>");
            bw.write("<td>");
            bw.write(strs[2].substring(0, strs[2].indexOf("</TD>")));
            bw.write("</td><td>");
            bw.write(strs[3].substring(0, strs[3].indexOf("</TD>")));
            bw.write("</td></tr>");
        }
    }

//设置代理
    public static void initProxy(String host, String port) {
        System.setProperty("http.proxyType", "4");
        System.setProperty("http.proxyPort", port);
        System.setProperty("http.proxyHost", host);
        System.setProperty("http.proxySet", "true");
    }

//获取网页的内容
    public static String getContent(String strUrl) throws Exception {
        try {
            URL url = new URL(strUrl);
            BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream(),Charset.forName(CHARSET)));
            String s = "";
            StringBuffer sb = new StringBuffer("");
            while ((s = br.readLine()) != null) {
                sb.append(s);
            }

br.close();
            return sb.toString();
        } catch (Exception e) {
            System.out.println("can't open url:"+strUrl);
            throw e;
        }
    }

}

运行后获取的文件如下:

各位可以根据自己的需求修改生成的文件的格式,或者直接将结果插入自己的数据库皆可。

使用java爬取国家统计局的12位行政区划代码相关推荐

  1. 【Java】Java爬取国家统计局五级行政区划编码(省、市(州)、县(区)、乡(镇)、村)

    今天使用了idea+java爬取国家统计局12位行政区划编码,包括省.市(州).县(区).乡(镇).以及村委会/委员会等的行政编码和名称,将区划编码以及名称保存在数据库中. 本文内容包括数据库数据效果 ...

  2. Java 爬取国家统计局统计用区划代码和城乡划分代码

    插入速度比较慢,建议修改成批量插入. 用的 Spring Boot2.MyBatis Plus(Jdbc 都行,随便你).Junit5.okhttp.jsoup.dozer(你可以手动赋值,没几个属性 ...

  3. 用java爬取杭电oj已ac代码

    前言 电脑的硬盘突然坏了,新安装的eclipse的代码全没了,后来发现杭电上已经ac的代码可以查看到,我是个有强迫症的人,我宁愿做很多件不同的事也不愿意做一件相同的事(复制黏贴)许多次,所以就突发奇想 ...

  4. java爬取新浪微博登陆_30行jsoup代码搞定新浪微博登录抓取爬虫

    主要是设置cookies 想知道方法的朋友可以留言哦 爬虫问题都可以探讨哦 import java.io.IOException; import java.util.HashMap; import j ...

  5. python房价数据分析统计服_Python 爬取分析全国 12 个城市 4 万条房价信息,告诉你该怎样买房?...

    原标题:Python 爬取分析全国 12 个城市 4 万条房价信息,告诉你该怎样买房? 作者 | 月小水长 责编 | 伍杏玲通过分页.线程池.代理池等技术,快速爬取链家网近4万条在售二手房信息,速度可 ...

  6. java爬取网页内容 简单例子(2)——附jsoup的select用法详解

    [背景] 在上一篇博文 java爬取网页内容 简单例子(1)--使用正则表达式 里面,介绍了如何使用正则表达式去解析网页的内容,虽然该正则表达式比较通用,但繁琐,代码量多,现实中想要想出一条简单的正则 ...

  7. java爬取当当网所有分类的图书信息(ISBN,作者,出版社,价格,所属分类等)

    java爬取当当网所有分类的图书信息(ISBN,作者,出版社,价格,所属分类等) 顺手写的,没有建立新项目,放我自己的项目的一个文件夹里了,有兴趣的朋友可以拉下来试试 https://gitee.co ...

  8. java爬取论坛信息_Java爬取校内论坛新帖

    Java爬取校内论坛新帖 为了保持消息灵通,博主没事会上上校内论坛看看新帖,作为爬虫爱好者,博主萌生了写个爬虫自动下载的想法. 嗯,这次就选Java. 第三方库准备 Jsoup Jsoup是一款比较好 ...

  9. Java爬取B站弹幕 —— Python云图Wordcloud生成弹幕词云

    一 . Java爬取B站弹幕 弹幕的存储位置 如何通过B站视频AV号找到弹幕对应的xml文件号 首先爬取视频网页,将对应视频网页源码获得 就可以找到该视频的av号aid=8678034 还有弹幕序号, ...

最新文章

  1. 在OpenCV中利用卷积进行图像滤波
  2. C#中string类型赋值问题
  3. Angular如何判断某个DOM节点包含Directive
  4. windbg + sos 调试w3wp进程内存崩溃问题
  5. Spring集成Quartz定时任务框架介绍
  6. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]50.什么是BLS基于对的签名方案?
  7. 简单的签到代码_PHP实现一个小小的签到功能,到底用MySQL还是Redis?
  8. Graph_Master(连通分量_Poj_1904)
  9. orange实现逻辑回归_逻辑回归模型
  10. 媒体查询以及flexbox,响应式图片
  11. 爬虫---如何抓取app的思路和方案
  12. 如何直接操作SVN将分支代码合并到主干
  13. 关闭笔记本电脑计算机键盘,笔记本电脑键盘怎么关_笔记本电脑键盘关闭步骤-win7之家...
  14. c语言选择题题及答案,c语言选择题
  15. 初级程序员晋升中级程序员,只差这7个技能
  16. jQuery ajax请求两次问题,jquery ajax请求了两次问题
  17. Face Super-Resolution Guided by 3D Facial Priors(ECCV2020)论文解读
  18. 创业第一步:创业方程式
  19. linux socket函数详解,linuxSocket_函数.doc
  20. Android 颜色的半透明效果

热门文章

  1. 如何加减单元格指定数字_如何把单元格的数值每位数字进行相加?又学会一个Excel技巧...
  2. 真香!端午节到来,我用Python画了几个粽子送给女票,女票差点吃了我的电脑...
  3. 网络打印机计算机服务,如何把局域网中的所有计算机及打印机设置共享?
  4. sd-wan专线组网
  5. 客户端架构设计的简单总结
  6. Springboot 使用 sendgrid发送邮件
  7. Flutter 实体类转String,String转实体类
  8. 常用的html标签及用法,html常用标签及其属性用法
  9. redefinition of class解决
  10. 网易云信IM即时通讯聊天源码SDK 并发高轻松万人并发稳定不丢消息 后端PHP 前端 安卓Java