日期:2014-05-17  浏览次数:20742 次

教你如何自己制作IP地址查询的API,摆脱第三方API---(二)
建议读者先看上一篇教程:

教你如何自己制作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"
&nb