开发系统时经常要用到中国行政区划分数据,特别是做电商系统中的管理收货地址功能。以前通过爬百度地图数据制作的行政区域只支持三级,今天尝试爬京东的数据,支持省市县乡四级区域。

为什么爬京东的数据?原因很简单:京东做这么大了,这一块基础数据应该很全很成熟了。这个纯粹是抓数据,原理很简单不多说,直接上代码。

一、创建数据库表

首先要创建一个数据库表(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采集京东的全国行政区划数据相关推荐

  1. java 异常怎么划分_java异常的分类

    所有异常都继承自java.lang.Throwable类,throwable有两个直接子类Exception和Error. 1 Exception Exception分两类:运行时异常RuntimeE ...

  2. java实现行政区域划分,行政区划正则表达式匹配规则及java实现

    行政区划正则表达式匹配规则及java实现 行政区划正则表达式匹配规则及java实现 (.*?省|.*?市|.*?自治区)?(.*?市|.*?县|.*?区|.*?自治州)?(.*?县|.*?区)(.*? ...

  3. mvc框架java包怎么划分_java – 在MVC模式中将模型和动作划分为类...

    原则上,例如domain model,模型层,例如"模型",应分为以下几个部分: > Entities,例如域对象(如您的员工)和value objects.每个实体不仅包含 ...

  4. java数组表格输出_Java 如何将数组中的数据以表格形式输出

    简介 ES是一个基于RESTful web接口并且构建在Apache Lucene之上的开源分布式搜索引擎. 同时ES还是一个分布式文档数据库,其中每个字段均可被索引,而且每个字段的数据均可被搜索,能 ...

  5. java 读取excel列_Java读取Excel指定列的数据详细教程和注意事项

    本文使用jxl.jar工具类库实现读取Excel中指定列的数据. jxl.jar是通过java操作excel表格的工具类库,是由java语言开发而成的.这套API是纯Java的,并不依赖Windows ...

  6. clob在java里的类型_Java对Oracle中Clob类型数据的读取和写入(转)

    Java对Oracle中Clob数据类型是不能够直接插入的,但是可以通过流的形式对clob类型数据写入或者读取,网上代码并不算特别多,讲的也不是很清楚,我对网上资料进行了整理和总结,具体看代码: 写入 ...

  7. java获取接口数据类型_java中调用第三方接口获取数据的方式

    //get请求方式 private String getInfo(Map params,String URL) { // 创建Httpclient对象 CloseableHttpClient http ...

  8. java word模版填充_java向word模板中填充数据(总结)

    使用过PageOffice动态生成word文档的人都知道,PageOffice可以给word文档的指定位置进行填充,这里我们所说的指定位置在PageOffice的专业术语里面有两个概念,一个叫做数据区 ...

  9. java查看内存地址_Java内存机制和内存地址

    问题一: String str1 = "abc"; String str2 = "abc"; System.out.println(str1==str2); / ...

  10. Python爬虫案例-获取最新的中国行政区域划分

    源网页:中国统计局标准 http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2016/ 打开网页后可以分析出行政区域划分共分为5层 根据传入参数,生成网页 ...

最新文章

  1. Windows 7 Natvie VHD
  2. 实时个性化推荐系统简述
  3. subsequence 1(牛客多校第五场记忆化搜索+组合数学)
  4. [APIO2018] New Home 新家(线段树,二分答案,离散化)
  5. 写出下列的中文意思 HTML,计算机网络技术考试试题纸B卷
  6. SQLite数据库---ListView控件之商品展示案例
  7. linux系统下树莓派拍照,如何在树莓派上使用图片特效
  8. Exact-k:组合推荐的秘密
  9. java学习(三) java 中 mongodb的各种操作
  10. WinForm二三事(一)消息循环
  11. Ps 初学者教程,如何使用图层混合模式合成图像?
  12. 锐浪报表数据源access_C# 锐浪报表 示例源码
  13. 不定长多项式展开后,展开式各阶系数的Java代码实现
  14. gitlab-runner错误之:New runner. Has not connected yet(runner注册成功到了gitlab,但是前面的图标是灰色三角形)
  15. could not initialize proxy - the owning Session was closed解决
  16. 他来了他来了,Hadoop序列化和切片机制了解一下?
  17. 判断字符串是否在base64编码范围内
  18. Phillip and Trains(dfs专题)
  19. C++中string.find()函数与string::npos
  20. 使用MFC修改注册表DWORD类型的值

热门文章

  1. java 加密压缩文件
  2. 构建之法——现代软件工程
  3. iOS备忘录之IOS开发的一些网站(看看还是不错的)
  4. IEC103规约报文举例
  5. java毕业设计_智能出差报销管理系统
  6. 企业IT架构转型之道(书)总结以及反思
  7. python调用nmap扫描全端口_python nmap实现端口扫描器教程
  8. opencv实现图片的任意角度旋转
  9. CTF攻防世界刷题51-
  10. Windows 8 开启 NetFX3