阅读前提:
在阅读之前,请参考知乎上对ip库的一个简要讨论:
http://www.zhihu.com/question/19584593
阅读目的:一步一步建立ip库,目前采用的是纯真IP库,纯真ip库是一个民间收集的ip库:
QQ IP数据库收集了包括中国电信、中国网通、长城宽带、网通宽带、聚友宽带等 ISP 的最新准确 IP 地址数据。包括最全的网吧数据
1 : 下载地址:
我的下载地址为:http://www.pc6.com/softview/SoftView_41490.html
一旦失效,请自行baidu.
2 : 下载以后是是一个纯真的Exe文件,点击安装,没关系。纯真已经封装为Exe APP 方便使用了。
3 : 安装后,启动界面如下,请点击导出按钮:
3:导出的文件,在本博文之中,将命名为IpBase
4 : 原始的数据格式如下:
起始 结束 位置
1.57.23.0 1.57.31.255 黑龙江省绥化市 联通
1.57.32.0 1.57.32.255 黑龙江省绥化市望奎县 联通
1.57.33.0 1.57.33.255 黑龙江省绥化市 联通
1.57.34.0 1.57.34.255 黑龙江省绥化市肇东市 联通
通常在应用程序之中,需要将ip转换为一个long 类型的值,并且将地理位置分为多级:
实例如下:
465645664,44655468,黑龙江省,绥化市
由于具体的区县,目前数据采集还不够完善。所以我们只是简单的区两级地理位置:
以下是一个我写的转换代码:比较繁琐。将 省份,区域,
package com.mixbox.parser.IPBaseTransfer;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import com.coreJava.ipAndLong.IpAndLongTransfer;
public class cz_fileTofile {
public static final String _filePath = "E:\\ipBase.txt";
public static final String _outPath = "E:\\ipBase_new2.txt";
public static final String _blank = " ";
public static BufferedReader _bufferedReader;
public static BufferedWriter _bufferedWriter;
public static String _comma = ",";
public static void main(String[] args) throws IOException {
_bufferedReader = new BufferedReader(new InputStreamReader(
new FileInputStream(_filePath), "GBK"));
_bufferedWriter = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(_outPath), "GBK"));
String str = null;
while ((str = _bufferedReader.readLine()) != null) {
try {
pn("--------------------------- start");
String onebank = str.replaceAll("\\s{1,}", " ");
pn(onebank);
String[] records = onebank.split(_blank);
if (records.length < 3) {
System.err.println(onebank);
System.exit(1);
}
String location = records[2];
pn(location);
// 我们把location直接解析成 省份,城市,和地区
String province = null;
String city = null;
String area = null;
// 针对有省份的进行修改
province = getProvince(location);
city = getCity(location);
pn("修改后的省:" + province);
pn("修改后的城市:" + city);
long begin_ip = IpAndLongTransfer.ipToLong(records[0]);
long end_ip = IpAndLongTransfer.ipToLong(records[1]);
pn("开始ip" + begin_ip);
pn("结束ip" + end_ip);
StringBuffer sb = new StringBuffer();
sb.append(begin_ip).append(_comma).append(end_ip)
.append(_comma).append(province).append(_comma)
.append(city);
String writerString = sb.toString();
_bufferedWriter.write(writerString);
_bufferedWriter.newLine();
pn("--------------------------- end \n");
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 从location之中得到我们的城市
private static String getCity(String location) {
String returnCity = "无法确定";
// 当前的字符串是某省某市的格式,省下面可能是市,也可能是区,比如说:黑龙江省大兴安岭地区
if (location.contains("省")) {
// 如果有区,那么先截取到区
// 3683905536,3683905631,黑龙江,大兴安岭地区
// 3683902117,3683902141,黑龙江,伊春市伊春区
//
if (location.contains("区")) {
int num_province = location.indexOf("省");
int num_city = location.indexOf("区");
returnCity = location.substring(num_province + 1, num_city + 1);
}
// 比如 大兴安领区是不包括市,所有returncity不变
// 如果是 伊春市伊春区,那么截取的就是 伊春市
if (location.contains("市")) {
int num_province = location.indexOf("省");
int num_city = location.indexOf("市");
returnCity = location.substring(num_province + 1, num_city + 1);
}
}
if (location.contains("北京") || location.contains("上海")
|| location.contains("重庆") || location.contains("天津")) {
int length = location.length();
// 其中的信息只包含了 北京市,上海市,重庆市,天津市等
if (location.length() == 3) {
// 其中的信息包含了北京市以外的其他区县
} else if (length > 3) {
int num_split = location.indexOf("市") + 1;
returnCity = location.substring(num_split);
}
}
if (location.contains("西藏") || location.contains("新疆")
|| location.contains("广西") || location.contains("宁夏")
|| location.contains("内蒙")) {
int firstSplitPoint = 0;
int endSplitPoint = location.length();
// 内蒙占位为3,在原始数据之中是内蒙古,而不是内蒙古自治区
if (location.contains("内蒙")) {
firstSplitPoint = 3;
// 如果整个的位置为“内蒙古",那么就无法确定内蒙古下面到底是哪一个城市
if (location.equals("内蒙古")) {
returnCity = "无法确定";
}
int num_city = location.indexOf("市");
returnCity = location.substring(firstSplitPoint, num_city + 1);
// 其他的几个自制区为2
} else {
firstSplitPoint = 2;
if (location.equals("西藏") || location.equals("新疆")
|| location.equals("广西") || location.equals("宁夏")) {
returnCity = "无法确定";
}
int num_city = location.indexOf("市");
returnCity = location.substring(firstSplitPoint, num_city + 1);
}
}
// 特别行政区
if (location.contains("香港")) {
returnCity = "香港";
}
if (location.contains("澳门")) {
returnCity = "澳门";
}
return returnCity;
}
private static String getProvince(String location) {
String returnProvince = "无法确定";
// 省
if (location.contains("省")) {
if (location.equals("黑龙江省")) {
returnProvince = "黑龙江省";
} else {
returnProvince = location.substring(0, 3);
}
}
// 自治区
if (location.contains("西藏")) {
returnProvince = "西藏自治区 ";
}
if (location.contains("新疆")) {
returnProvince = "新疆维吾尔自治区 ";
}
if (location.contains("广西")) {
returnProvince = " 广西壮族自治区 ";
}
if (location.contains("宁夏")) {
returnProvince = "宁夏回族自治区 ";
}
if (location.contains("内蒙古")) {
returnProvince = "内蒙古自治区";
}
// 直辖市
if (location.contains("北京")) {
returnProvince = "北京市";
}
if (location.contains("上海")) {
returnProvince = "上海市";
}
if (location.contains("天津")) {
returnProvince = "天津市";
}
if (location.contains("重庆")) {
returnProvince = "重庆市";
}
// 特别行政区
if (location.contains("香港")) {
returnProvince = "香港特别行政区";
}
if (location.contains("澳门")) {
returnProvince = "澳门特别行政区";
}
return returnProvince;
}
private static void isBkank(String[] records, int i) {
if (records[i] != _blank) {
p(records[i]);
}
}
public static void pn(Object o) {
System.out.println(o.toString());
}
public static void p(Object o) {
System.out.print(o.toString());
}
}
作为一个参考:请自行再做修改~
Simple Tips。
转换后的结果如下所示:
long long 省份 城市
3658172295,3658172295,河北省,保定市
3658172296,3658172333,河北省,保定市
3658172334,3658172334,河北省,保定市
3658172335,3658172402,河北省,保定市
3658172403,3658172403,河北省,保定市
3658172404,3658172415,河北省,保定市
3658172416,3658172671,河北省,秦皇岛市
3658172672,3658172927,河北省,秦皇岛市
3658172928,3658175487,河北省,秦皇岛市
3658175488,3658176879,河北省,廊坊市
3658176880,3658176880,河北省,廊坊市
3658176881,3658176904,河北省,廊坊市
3658176905,3658176905,河北省,廊坊市
3658176906,3658176998,河北省,廊坊市
3658176999,3658176999,河北省,廊坊市
3658177000,3658177020,河北省,廊坊市
3658177021,3658177021,河北省,廊坊市
3658177022,3658177642,河北省,廊坊市
3658177643,3658177643,河北省,廊坊市
3658177644,3658177681,河北省,廊坊市
3658177682,3658177682,河北省,廊坊市