JAVA采集京东的全国行政区划数据

5 篇文章 0 订阅
3 篇文章 0 订阅

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


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

一、创建数据库表

首先要创建一个数据库表(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;

/** 
 * <pre>
 * ClassName: AreaUtil
 * Description:TODO(这里用一句话描述这个类的作用)
 * Create by: 罗旭东
 * Date: 2018年6月23日 上午18:24:24
 * </pre>
 */
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();
	}
}

三、其他

以上哪里写的不对或者有待改进,欢迎大家提意见,谢谢!
采集数据下载地址(更新与2018年6月):https://hx.rqba.com/211.html
转载请注明出处:JAVA采集京东的全国行政区划数据 - 东哥小站

province:北京 --cityName:朝阳区 ----countyName:三环以内 ----countyName:三环到四环之间 ----countyName:四环到五环之间 ----countyName:五环到六环之间 ----countyName:管庄 ----countyName:北苑 ----countyName:定福庄 --cityName:海淀区 ----countyName:三环以内 ----countyName:三环到四环之间 ----countyName:四环到五环之间 ----countyName:五环到六环之间 ----countyName:六环以外 ----countyName:上地 ----countyName:西三旗 ----countyName:清河 ----countyName:圆明园西路 ----countyName:农业大学西校区 ----countyName:西二旗 --cityName:西城区 ----countyName:内环到二环里 ----countyName:二环到三环 --cityName:东城区 ----countyName:内环到三环里 --cityName:崇文区 ----countyName:一环到二环 ----countyName:二环到三环 --cityName:宣武区 ----countyName:内环到三环里 --cityName:丰台区 ----countyName:四环到五环之间 ----countyName:二环到三环 ----countyName:三环到四环之间 ----countyName:五环到六环之间 ----countyName:六环之外 --cityName:石景山区 ----countyName:四环到五环内 ----countyName:石景山城区 ----countyName:八大处科技园区 --cityName:门头沟 ----countyName:郊区 ----countyName:城区以内 --cityName:房山区 ----countyName:郊区 ----countyName:城区以内 --cityName:通州区 ----countyName:五环到六环之间 ----countyName:六环以外(其他地区) ----countyName:六环以外(张家湾镇、台湖镇、漷县镇、宋庄镇) ----countyName:六环以外(于家务乡) --cityName:大兴区 ----countyName:四环至五环之间 ----countyName:六环以外 ----countyName:五环至六环之间 ----countyName:北京经济技术开发区 --cityName:顺义区 ----countyName:顺义区(城区内,天竺镇,马坡镇,牛栏山镇,后沙峪镇城区) ----countyName:顺义区(郊区) ----countyName:顺义区(南彩镇、李桥镇) --cityName:怀柔区 ----countyName:郊区 ----countyName:城区以内 --cityName:密云区 ----countyName:城区以外 ----countyName:城区 --cityName:昌平区 ----countyName:城区以外 ----countyName:六环以内 ----countyName:城区 --cityName:平谷区 ----countyName:城区以外 ----countyName:城区 --cityName:延庆县 ----countyName:百泉路南,京新高速北,康张路西,京银路东 ----countyName:百泉路北,京新高速南,康张路东,京银路西 province:上海 --cityName:黄浦区 里面包含了jsonutils工具类 地区json NetTool类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值