java实现行政区域划分_JAVA采集京东的全国行政区划数据
开发系统时经常要用到中国行政区划分数据,特别是做电商系统中的管理收货地址功能。以前通过爬百度地图数据制作的行政区域只支持三级,今天尝试爬京东的数据,支持省市县乡四级区域。
为什么爬京东的数据?原因很简单:京东做这么大了,这一块基础数据应该很全很成熟了。这个纯粹是抓数据,原理很简单不多说,直接上代码。
一、创建数据库表
首先要创建一个数据库表(t_area),本人使用的是mysql,表结构如下:
二、代码实现
以下是抓取数据的java代码:
/**
* Title: AreaUtil.java
* Description:
* Copyright: Copyright (c) 2013-2015 luoxudong.com
* Company: 个人
* Author: 罗旭东 (hi@luoxudong.com)
* Date: 2018年6月23日 上午18:24:24
* Version: 1.0
*/
package com.luoxudong.plug.shop.utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.commons.lang.StringUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.luoxudong.core.utils.NetworkUtil;
/**
*
* ClassName: AreaUtil
* Description:TODO(这里用一句话描述这个类的作用)
* Create by: 罗旭东
* Date: 2018年6月23日 上午18:24:24
*
*/
public class AreaUtil {
/** 获取地区api */
private static final String URL_JD_AREA = "https://d.jd.com/area/get?fid=%d";
/** 初始化省份数据 */
private static final String[] TABLE_PROVINCE = new String[]{
"1","北京",
"2","上海",
"3","天津",
"4","重庆",
"5","河北",
"6","山西",
"7","河南",
"8","辽宁",
"9","吉林",
"10","黑龙江",
"11","内蒙古",
"12","江苏",
"13","山东",
"14","安徽",
"15","浙江",
"16","福建",
"17","湖北",
"18","湖南",
"19","广东",
"20","广西",
"21","江西",
"22","四川",
"23","海南",
"24","贵州",
"25","云南",
"26","西藏",
"27","陕西",
"28","甘肃",
"29","青海",
"30","宁夏",
"31","新疆",
"32","台湾",
"42","香港",
"43","澳门",
"84","钓鱼岛"
};
/**
* 初始化省份数据
* @param conn
*/
public static void initArea() {
try {
Connection conn = getConn("127.0.0.1", "3306", "数据库名称", "数据库用户名", "数据库登录密码");
for (int nIndex = 0; nIndex < TABLE_PROVINCE.length; nIndex = nIndex + 2) {
int id = Integer.parseInt(TABLE_PROVINCE[nIndex]);
String name = TABLE_PROVINCE[nIndex + 1];
try {
Statement stat = conn.createStatement();
String sql = "INSERT INTO t_area VALUES (" + id + ", '" + name + "',0, 0)";
stat.execute(sql);
stat.close();
initChildArea(conn, id, 1);
} catch (SQLException e) {
e.printStackTrace();
}
}
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取各省下级地区
* @param conn 数据库连接对象
* @param parentId 所属地区ID
* @param level 地区层级,省级:0,市级:1,...
*/
public static void initChildArea(Connection conn, int parentId, int level) {
String url = String.format(URL_JD_AREA, parentId);
String text = NetworkUtil.getData(url);
if (!StringUtils.isEmpty(text)) {
JSONArray array = JSON.parseArray(text);
if (array != null && array.size() > 0) {
for (int nIndex = 0; nIndex < array.size(); nIndex++) {
JSONObject object = array.getJSONObject(nIndex);
int id = object.getInteger("id");
String name = object.getString("name");
try {
Statement stat = conn.createStatement();
String sql = "INSERT INTO t_area VALUES (" + id + ", '" + name + "'," + parentId + ", " + level + ")";
stat.execute(sql);
stat.close();
initChildArea(conn, id, level + 1);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
/**
* 链接数据库
* @param dbHost 数据库主机地址
* @param dbPort 数据库端口
* @param dbName 数据库名称
* @param dbUser 数据库用户名称
* @param dbPassword 数据库登录密码
* @return
* @throws Exception
*/
public static Connection getConn(String dbHost, String dbPort, String dbName, String dbUser, String dbPassword) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Class.forName("com.mysql.jdbc.Driver").newInstance();
String connStr = "jdbc:mysql://" + dbHost + ":" + dbPort + "/" + dbName
+ "?user=" + dbUser + "&password=" + dbPassword
+ "&characterEncoding=utf8";
Connection conn = DriverManager.getConnection(connStr);
return conn;
}
public static void main(String[] args) {
initArea();
}
}
三、其他
java实现行政区域划分_JAVA采集京东的全国行政区划数据相关推荐
- java 异常怎么划分_java异常的分类
所有异常都继承自java.lang.Throwable类,throwable有两个直接子类Exception和Error. 1 Exception Exception分两类:运行时异常RuntimeE ...
- java实现行政区域划分,行政区划正则表达式匹配规则及java实现
行政区划正则表达式匹配规则及java实现 行政区划正则表达式匹配规则及java实现 (.*?省|.*?市|.*?自治区)?(.*?市|.*?县|.*?区|.*?自治州)?(.*?县|.*?区)(.*? ...
- mvc框架java包怎么划分_java – 在MVC模式中将模型和动作划分为类...
原则上,例如domain model,模型层,例如"模型",应分为以下几个部分: > Entities,例如域对象(如您的员工)和value objects.每个实体不仅包含 ...
- java数组表格输出_Java 如何将数组中的数据以表格形式输出
简介 ES是一个基于RESTful web接口并且构建在Apache Lucene之上的开源分布式搜索引擎. 同时ES还是一个分布式文档数据库,其中每个字段均可被索引,而且每个字段的数据均可被搜索,能 ...
- java 读取excel列_Java读取Excel指定列的数据详细教程和注意事项
本文使用jxl.jar工具类库实现读取Excel中指定列的数据. jxl.jar是通过java操作excel表格的工具类库,是由java语言开发而成的.这套API是纯Java的,并不依赖Windows ...
- clob在java里的类型_Java对Oracle中Clob类型数据的读取和写入(转)
Java对Oracle中Clob数据类型是不能够直接插入的,但是可以通过流的形式对clob类型数据写入或者读取,网上代码并不算特别多,讲的也不是很清楚,我对网上资料进行了整理和总结,具体看代码: 写入 ...
- java获取接口数据类型_java中调用第三方接口获取数据的方式
//get请求方式 private String getInfo(Map params,String URL) { // 创建Httpclient对象 CloseableHttpClient http ...
- java word模版填充_java向word模板中填充数据(总结)
使用过PageOffice动态生成word文档的人都知道,PageOffice可以给word文档的指定位置进行填充,这里我们所说的指定位置在PageOffice的专业术语里面有两个概念,一个叫做数据区 ...
- java查看内存地址_Java内存机制和内存地址
问题一: String str1 = "abc"; String str2 = "abc"; System.out.println(str1==str2); / ...
- Python爬虫案例-获取最新的中国行政区域划分
源网页:中国统计局标准 http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2016/ 打开网页后可以分析出行政区域划分共分为5层 根据传入参数,生成网页 ...
最新文章
- Windows 7 Natvie VHD
- 实时个性化推荐系统简述
- subsequence 1(牛客多校第五场记忆化搜索+组合数学)
- [APIO2018] New Home 新家(线段树,二分答案,离散化)
- 写出下列的中文意思 HTML,计算机网络技术考试试题纸B卷
- SQLite数据库---ListView控件之商品展示案例
- linux系统下树莓派拍照,如何在树莓派上使用图片特效
- Exact-k:组合推荐的秘密
- java学习(三) java 中 mongodb的各种操作
- WinForm二三事(一)消息循环
- Ps 初学者教程,如何使用图层混合模式合成图像?
- 锐浪报表数据源access_C# 锐浪报表 示例源码
- 不定长多项式展开后,展开式各阶系数的Java代码实现
- gitlab-runner错误之:New runner. Has not connected yet(runner注册成功到了gitlab,但是前面的图标是灰色三角形)
- could not initialize proxy - the owning Session was closed解决
- 他来了他来了,Hadoop序列化和切片机制了解一下?
- 判断字符串是否在base64编码范围内
- Phillip and Trains(dfs专题)
- C++中string.find()函数与string::npos
- 使用MFC修改注册表DWORD类型的值