Jsoup获取全国地区数据(省市县镇村)(续) 纯干货分享
前几天给大家分享了一下,怎么样通过jsoup来从国家统计局官网获取全国省市县镇村的数据。错过的朋友请点击这里。
上文说到抓取到数据以后,我们怎么转换成我们想要格式呢?哈哈,解析方式可能很简单,但是有一点我是知道的,很多人是伸手党,那么我就把我的处理过程给大家分享出来,觉得不错的,请点个赞。
第一步:将获取到的txt文件转换成数据库文件:
这里需要备注一下,下文所有的资源压缩文件,解压密码都是我的博客园昵称。为什么要加密码给大家解释一下:前期发出的博文被其他很多站点爬取了,但是都没有原文链接或者转载说明,一点都不尊重原博文的版权。给大家带来的不便,敬请谅解。
上次博文处理后的文本数据下载地址:点击下载
废话不多说,直接上代码将抓取到的文本文件转换成数据库数据:
1 import java.io.BufferedReader;
2 import java.io.File;
3 import java.io.FileNotFoundException;
4 import java.io.FileReader;
5 import java.io.IOException;
6 import java.sql.Connection;
7 import java.sql.DriverManager;
8 import java.sql.SQLException;
9 import java.sql.Statement;
10
11 public class ResolveData1
12 {
13 private static Connection connection = null;
14
15 public static void main(String[] args)
16 {
17 initDB();
18
19 BufferedReader bufferedReader = null;
20 try
21 {
22 bufferedReader = new BufferedReader(new FileReader(new File("f:\\CityInfo.txt")));
23 String line = null;
24 while ((line = bufferedReader.readLine()) != null)
25 {
26 inser2DB(getCityName(line), getCityLevel(line), getCityCode(line));
27 System.out.println("处理中……");
28 }
29 } catch (FileNotFoundException e)
30 {
31 e.printStackTrace();
32 } catch (IOException e)
33 {
34 e.printStackTrace();
35 }
36 }
37
38 private static void initDB()
39 {
40 try
41 {
42 Class.forName("com.mysql.jdbc.Driver");
43 connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/51houseservice", "数据库账户",
44 "数据库密码");
45 } catch (SQLException e)
46 {
47 e.printStackTrace();
48 } catch (ClassNotFoundException e)
49 {
50 e.printStackTrace();
51 }
52 }
53
54 private static String getCityName(String line)
55 {
56 return line.substring(0, line.indexOf("{"));
57 }
58
59 private static String getCityCode(String line)
60 {
61 return line.substring(line.indexOf("[") + 1, line.indexOf("]"));
62 }
63
64 private static int getCityLevel(String line)
65 {
66 return Integer.parseInt(line.substring(line.indexOf("{") + 1, line.indexOf("}")));
67 }
68
69 private static void inser2DB(String cityName, int cityLevel, String cityCode)
70 {
71 try
72 {
73
74 Statement createStatement = connection.createStatement();
75 createStatement
76 .executeUpdate("insert into _51houseservice_citys_copy(city_name_zh,city_level,city_code) values('"
77 + cityName + "'," + cityLevel + ",'" + cityCode + "')");
78 } catch (SQLException e)
79 {
80 e.printStackTrace();
81 }
82 }
83 }
执行完以上程序以后,那么数据就已经妥妥的放入数据库了。存入数据库的数据,相信各位码农都是高手,这些数据都成了你们砧板上的与鱼肉了吧。
第二步:将数据库的每一行数据添加上其父城市
细心的朋友一定发现了,上面的每一个城市数据都只是包含一自己本身的详细信息,但是省级城市与市级城市之间没有任何关联。基于树形结构的数据在数据库应该怎样存储我就不多说了。这里就直接贴上关联各上下级关联的城市的代码:
接下来的是处理过程中的代码:
1 package com.wyhousesevice.test;
2 import java.sql.Connection;
3 import java.sql.DriverManager;
4 import java.sql.ResultSet;
5 import java.sql.SQLException;
6 import java.sql.Statement;
7 import java.util.ArrayList;
8 import java.util.List;
9
10 public class ResolveData3
11 {
12 private static Connection connection;
13
14 public static void main(String[] args)
15 {
16 initDB();
17 try
18 {
19 // 获取源表中一行数据
20 ResultSet rs = getAllCitys();
21 rs.next();
22 while (rs.next())
23 {
24 // 如果该项存在父ID,则跳过设置
25 if (rs.getInt("parent_id") == 0)
26 {
27 List<String> parentCodes = getParentCodes(rs.getString("city_code"));
28 // 获取目标数据库的数据ID
29 int parentId = getParentId(parentCodes, rs.getInt("city_level") - 1);
30 doUpdate(rs.getInt("id"), parentId);
31 System.out.println("handling:" + rs.getInt("id"));
32 }
33 }
34 }
35 catch (SQLException e)
36 {
37 e.printStackTrace();
38 }
39
40 closeDB();
41 }
42
43 private static void doUpdate(int id, int parentId)
44 {
45 try
46 {
47 Statement statement = connection.createStatement();
48 statement.executeUpdate("UPDATE _51houseservice_citys_copy SET parent_id = " + parentId + " WHERE id = "
49 + id);
50 }
51 catch (SQLException e)
52 {
53 e.printStackTrace();
54 }
55 }
56
57 private static int getParentId(List<String> parentCodes, int level) throws SQLException
58 {
59 Statement statement = connection.createStatement();
60 for (String string : parentCodes)
61 {
62 ResultSet executeQuery = statement
63 .executeQuery("select * from _51houseservice_citys_copy where city_code='" + string
64 + "' and city_level=" + level);
65 if (executeQuery.next())
66 {
67 return executeQuery.getInt("id");
68 }
69 }
70 return -1;
71 }
72
73 private static List<String> getParentCodes(String cityCode)
74 {
75 List<String> dataList = new ArrayList<String>();
76
77 if (cityCode.endsWith("0"))
78 {
79 String code = rmvLastZero(cityCode);
80 for (int i = 1; i < code.length() - 1; i++)
81 {
82 String substring = code.substring(0, code.length() - i);
83 StringBuilder sb = new StringBuilder(substring);
84 for (int j = substring.length(); j < 12; j++)
85 {
86 sb.append("0");
87 }
88 dataList.add(sb.toString());
89 }
90 }
91 else
92 {
93 for (int i = 1; i < cityCode.length() - 1; i++)
94 {
95 String substring = cityCode.substring(0, cityCode.length() - i);
96 StringBuilder sb = new StringBuilder(substring);
97 for (int j = 1; j <= i; j++)
98 {
99 sb.append("0");
100 }
101 dataList.add(sb.toString());
102 }
103 }
104 return dataList;
105 }
106
107 private static String rmvLastZero(String cityCode)
108 {
109 while (cityCode.endsWith("0"))
110 {
111 cityCode = cityCode.substring(0, cityCode.length() - 1);
112 }
113 return cityCode;
114 }
115
116 private static ResultSet getAllCitys()
117 {
118 try
119 {
120 Statement createStatement = connection.createStatement();
121 return createStatement.executeQuery("select * from _51houseservice_citys_copy");
122 }
123 catch (SQLException e)
124 {
125 e.printStackTrace();
126 return null;
127 }
128 }
129
130 private static void closeDB()
131 {
132 if (connection != null)
133 {
134 try
135 {
136 connection.close();
137 }
138 catch (SQLException e)
139 {
140 e.printStackTrace();
141 }
142 }
143 }
144
145 private static void initDB()
146 {
147 try
148 {
149 Class.forName("com.mysql.jdbc.Driver");
150 connection = DriverManager
151 .getConnection("jdbc:mysql://localhost:3306/51houseservice", "数据库账户", "数据库密码");
152 }
153 catch (SQLException e)
154 {
155 e.printStackTrace();
156 }
157 catch (ClassNotFoundException e)
158 {
159 e.printStackTrace();
160 }
161 }
162 }
接下来就需要时间处理了,慢慢的处理.....最终得到的sql转储文件结果如下:点击下载
如果你觉得本博文对你有所帮助,请记得点击右下方的"推荐"哦,么么哒...
转载请注明出处:http://www.cnblogs.com/liushaofeng89/p/4937714.html
Jsoup获取全国地区数据(省市县镇村)(续) 纯干货分享的更多相关文章
- Jsoup获取全国地区数据(省市县镇村)
最近手头在做一些东西,需要一个全国各地的地域数据,从省市区到县镇乡街道的.各种度娘,各种谷歌,都没找到一个完整的数据.最后功夫不负有心人,总算找到一份相对来说比较完整的数据,但是这里的数据也只是精确到 ...
- 省市县镇村五级地址智能提取(标准地址源来自国家统计局官网)SpringBoot+Elasticsearch 5.6
项目目的 根据传入的地址,智能提取所属的省市县镇村5级地址.例如:用户输入“江苏南通嗨安李堡镇陈庄村8组88号”,我们需要提取到江苏省 南通市 海安县(即便用户输入了错字,“海”写成了“嗨”) 李 ...
- Jsoup获取部分页面数据失败 org.jsoup.UnsupportedMimeTypeException: Unhandled content type. Must be text/*, application/xml, or application/xhtml+xml.
用Jsoup在获取一些网站的数据时,起初获取很顺利,但是在访问某浪的数据是Jsoup报错,应该是请求头里面的请求类型(ContextType)不符合要求. 请求代码如下: private static ...
- Jsoup获取部分页面数据失败 Unhandled content type. Must be text/*, application/xml, or application/xhtml+xml
用Jsoup在获取一些网站的数据时,起初获取很顺利,但是在访问某浪的数据是Jsoup报错,应该是请求头里面的请求类型(ContextType)不符合要求. 请求代码如下: private static ...
- 全中国的省市县镇乡村数据获取以及展示java源代码
第一步.准备工作(数据源+工具): 数据源(截止目前最全面权威的官方数据):http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2013/ 爬取数据的工具 ...
- 获取上海地区AQI质量数据Python脚本
一个获取上海地区AQI质量的Python脚本 https://github.com/yanyueoo7/Raspberrypi/blob/master/GetPmData_Shanghai.py #! ...
- 获取全国市以及地理坐标,各大坐标系北斗,百度,WGS-84坐标系的转换,有图,有代码
1 先上坐标取到的值: 获取到的坐标部分如下: '北京市':[116.39564503788,39.92998577808], '天津市':[117.21081309155,39.1439299033 ...
- 全国天气预报数据API调用PHP示例
本代码示例是基于PHP的聚合数据全国天气预报API服务请求的代码样例,使用前你需要: ①:通过https://www.juhe.cn/docs/api/id/39 申请一个天气预报API的appkey ...
- 全国地区sql表
/** * 中国省市区--地区SQL表 */ CREATE TABLE `rc_district` ( `id` smallint(5) unsigned NOT NULL AUTO_INCREMEN ...
随机推荐
- 自适应文案提示框、无数据图片加载<IOS小组件>
非常感谢,帮助我的朋友们,谢谢你们. 该组件的编写仅仅用来不到4个小时,包括测试与修改bug.为他起名为AdaptivePromptDialogBox(就是自适应文案提示框): 呆毛地址:链接 < ...
- B. Vanya and Food Processor【转】
B. Vanya and Food Processor time limit per test 1 second memory limit per test 256 megabytes input s ...
- Qt传入参数argc argv[]
QtCreator是非常不错的IDE,最近在做的Qt命令行应用,因为调试的环境不同等问题,需要在调试的时候为 main() 传入参数.度娘了半天,没找到方法,只能自力更生.后来在“项目-构建和运行-运 ...
- HDU - 4006 The kth great number multiset应用(找第k大值)
The kth great number Xiao Ming and Xiao Bao are playing a simple Numbers game. In a round Xiao Ming ...
- SqlServer自定义数据类型
定义:用户自己设计并实现的数据类型就称为用户自定义数据类型,即使这些数据类型基于系统数据类型. 创建用户自定义数据类型时,必须提供三个数: 数据类型的名称 所基于的系统数据类型 数据类型的可空性(是否 ...
- windows ping得通,连接不上网
这是被电脑安装的软件拦截的现象,我们只需要使用. netsh winsock reset 重启电脑即可
- SmartSql使用教程(1)——初探,建立一个简单的CURD接口服务
一.引言 最近SmartSql被正式引入到了NCC,借着这个契机写一个使用教程系列 二.SmartSql简介[摘自官方文档] 1. SmartSql是什么? SmartSql = MyBatis + ...
- 前端之CSS2
CSS盒子模型 CSS盒子模型介绍 盒子模型解释 元素在页面中显示成一个方块,类似一个盒子,CSS盒子模型就是使用现实中盒子来做比喻,帮助我们设置元素对应的样式. 盒子模型示意图如下: 把元素叫做盒子 ...
- IOS按需返回刷新数据
问题描述 相信大家都会遇到过这种情况: 进入下一页面,并且在下一页面执行某一动作,返回要刷新,没有执行某一动作,返回不刷新.也就是当前页面要实现按照需求刷新页面 实现思路 在当前页面定义个Bool类型 ...
- 无法序列化会话状态。请注意,当会话状态模式为“StateServer”或“SQLServer”时,不允许使用无法序列化的对象或 MarshalByRef 对象。
原文链接:http://blog.csdn.net/byondocean/article/details/7564502 session是工作在你的应用程序进程中的.asp.net进程.iis往往会在 ...