建议读者先看上一篇教程:
教你如何自己制作IP地址查询的API,摆脱第三方API---(一):http://blog.csdn.net/ajaxhu/article/details/12321907
这篇教程主要介绍如何制作通过制定IP查询地址的API。
先打开http://www.ip138.com/,页面中有一个输入框,输入一个IP,查询,我们这里输入的是113.96.121.110,点击查询按钮,发现页面跳转到了:
http://www.ip138.com/ips138.asp?ip=113.96.121.110&action=2
仔细观察这个地址,其中的参数ip=后面跟着就是IP,action表示某种操作,这里不需要管。由此可知,要查询指定IP的地址,我们需要查询的页面,地址如下:
http://www.ip138.com/ips138.asp?ip=你的IP&action=2
我们看一下http://www.ip138.com/ips138.asp?ip=113.96.121.110&action=2的页面源代码,不错,地址信息直接加载在页面源码中:
<tr>
<td align="center">
<ul class="ul1">
<li>本站主数据:广东省广州市 电信</li>
<li>参考数据一:广东省 电信</li>
</ul>
</td>
</tr>
仔细分析页面发现,只需要找HTML源码中夹在 "<ur class="ul1">"和"</url></rd>"之间的部分,就是我们所需要的数据,数据的结构为:
<li>本站主数据:广东省广州市 电信</li>
<li>参考数据一:广东省 电信</li>
每条数据都在分号”:“和</li>之间,做一个简单的处理即可返
下面给出源代码:
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class IpGetter {
public static void main(String[] args) throws IOException {
IpGetter ipgetter = new IpGetter();
String info = new IpGetter().getInfo("113.96.121.110");
System.out.println("不规则结果:" + info);
ArrayList<String> addressarray=IpGetter.getAddresses(info);
System.out.println("规范化结果:"+addressarray.toString());
}
/**
* 取出html源码中<ul class=\"ul1\">和</center>之间的部分,即为我们要的结果(不规则字符串)
*
* @return
* @throws IOException
*/
public String getInfo(String ip) throws IOException {
String info = fetchHtml("http://www.ip138.com/ips138.asp?ip=" + ip
+ "&action=2", "gb2312");
int index1 = info.indexOf("<ul class=\"ul1\">") + 16;
int index2 = info.indexOf("</ul></td>");
info = info.substring(index1, index2);
return info;
}
/**
* 从不规则字符串中(getInfo()的结果),抽取出地址信息数组
*
* @param info
*/
public static ArrayList<String> getAddresses(String info) {
ArrayList<String> addressarray=new ArrayList<String>();
String regex = ":(.*?)</li>";
Pattern p = Pattern.compile(regex);
Matcher matcher = p.matcher(info);
while(matcher.find())
{
addressarray.add(matcher.group(1));
}
return addressarray;
}
/**
* 抓取某个网页的源代码
*
* @param urlstr
* 要抓取网页的地址
* @param charset
* 网页所使用的编码 如"utf-8","gbk"
* @return
* @throws IOException
*/
public String fetchHtml(String urlstr, String charset) throws IOException {
URL url = new URL(urlstr);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
InputStream is = con.getInputStream();
InputStreamReader isr = new InputStreamReader(is, charset);
String result = "";
int read;
while ((read = isr.read()) != -1) {
result += (char) read;
}
isr.close();
return result;
}
}
注释:上面的public static ArrayList<String> getAddresses(String info) 函数中用到的是正则表达式提取数据:
正则表达式:String regex = ":(.*?)</li>"; 这里解释一下,"."在正则表达式中表示任意字符,"*"表示若干个,"(.*)"表示若干个任意字符(括号起分隔作用,不代表字符),为什么要加个问号编程"(.*?)"呢,如果不加问号,匹配的模式是贪婪的,我们提取到的数据是:
本站主数据:广东省广州市 电信</li>
<li>参考数据一:广东省 电信
会跳过第一个</li>去找最后一个</li>,虽然上面的结果页符合正则表达式,但是它匹配到了尽量多的字符,这个是贪婪模式。加了问号之后,就变为非贪婪模式,会按照尽量短的字符去匹配。
上面那个正则表达式翻译一下可以理解为符合 ":任意字符串</li>"的字符串。
java api 正则表达式 ip 解析
------解决方案--------------------
支持一下

------解决方案--------------------
又学了一招。 谢谢
------解决方案--------------------