前言:

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

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

目前已经修改代码适配最新的2015年的抓取。

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

代码如下:

 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爬取同花顺股票数据(附源码)

    最近有小伙伴问我能不能抓取同花顺的数据,最近股票行情还不错,想把数据抓下来自己分析分析.我大A股,大家都知道的,一个概念火了,相应的股票就都大涨. 如果能及时获取股票涨跌信息,那就能在刚开始火起来的时 ...

  2. Java爬取先知论坛文章

    Java爬取先知论坛文章 0x00 前言 上篇文章写了部分爬虫代码,这里给出一个完整的爬取先知论坛文章代码. 0x01 代码实现 pom.xml加入依赖: <dependencies> & ...

  3. Java 爬取 51job 数据 WebMagic实现

    Java 爬取 51job 数据 一.项目Maven环境配置 相关依赖 jar 包配置 <parent> <groupId>org.springframework.boot&l ...

  4. Java中取小数点后两位(四种方法)

    摘自http://irobot.iteye.com/blog/285537 Java中取小数点后两位(四种方法)   一 Long是长整型,怎么有小数,是double吧     java.text.D ...

  5. MinerHtmlThread.java 爬取页面线程

    MinerHtmlThread.java 爬取页面线程 package com.iteye.injavawetrust.miner; import org.apache.commons.logging ...

  6. MinerConfig.java 爬取配置类

    MinerConfig.java 爬取配置类 package com.iteye.injavawetrust.miner; import java.util.List; /** * 爬取配置类 * @ ...

  7. Java爬取网络博客文章

    前言 近期本人在某云上购买了个人域名,本想着以后购买与服务器搭建自己的个人网站,由于需要筹备的太多,暂时先搁置了,想着先借用GitHub Pages搭建一个静态的站,搭建的过程其实也曲折,主要是域名地 ...

  8. Java爬取校内论坛新帖

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

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

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

随机推荐

  1. 追MM和Java的23种设计模式

    我在Java论坛看到这篇文章,作者以轻松的语言比喻了java的32种模式,有很好的启发作用,但可惜没有给出具体的意思,我就在后边加上了.这些都是最简单的介绍,要学习的话建议你看一下阎宏博士的<J ...

  2. Android图片加载框架最全解析(四),玩转Glide的回调与监听

    大家好,今天我们继续学习Glide. 在上一篇文章当中,我带着大家一起深入探究了Glide的缓存机制,我们不光掌握了Glide缓存的使用方法,还通过源码分析对缓存的工作原理进行了了解.虽说上篇文章和本 ...

  3. python各个模块循环引用问题解决办法

    当项目中的模块过多,或功能划分不够清晰时会出现循环引用的问题,如下 有两个模块moduleA 和 moduleB: #moduleA from moduleB import b def a(): pr ...

  4. 把Scala代码当作脚本运行

    1. 在类UNIX系统上作为脚本运行 在类Unix系统上,你可以设置一个shell前导词来执行脚本.如下例: Script.scala #!/usr/bin/env scala !# println( ...

  5. vue项目ide(vue项目环境搭建)

    一.先介绍一下我接下来要做的项目 项目:ide可视化工具 技术应用: Vue2.0(js框架):https://cn.vuejs.org/ ElementUi(饿了吗ui框架基于vue的):http: ...

  6. C++ Jsoncpp源代码编译与解析Json

    1.Json 数据表示方式介绍 这个可以看之前的一个文章里面有说明:Java解析(读取)Json数据 2.C++ Jsoncpp 2.1 Jsoncpp介绍 (1)JsonCpp主要包含三种类型的cl ...

  7. [leetcode]Valid Number @ Python

    原题地址:http://oj.leetcode.com/problems/valid-number/ 题意:判断输入的字符串是否是合法的数. 解题思路:这题只能用确定有穷状态自动机(DFA)来写会比较 ...

  8. Android消息通知-Notification

    Android中常用的消息提醒,一种是Toast弹出提醒内容,一种是AlterDialog弹出框来提醒用户,还有一种就是消息通知的,用Android经常收到各种通知就是Notifation.Notif ...

  9. C++初始化列表和大括号中构造的差别

    C++的对象构造函数有两种初始化的方法: 1.初始化列表 2.大括号中面赋值 这两种推荐使用另外一种.原因在于使用初始化列表仅仅须要进行一次初始化.而使用大括号内赋值的话首先须要调用默认构造函数初始化 ...

  10. Android -- 触摸Area对焦区域(更新)

    老早就想找关于不同点击不同地方的对焦,但是一直没有找到,现在项目又需要这个功能,又跑出来找找,最后还是找到啦~~关于对焦更多的是关于自动对焦. 废话不多说,直接来干货,主要是setFocusAreas ...