建议读者先看上一篇教程:
教你如何自己制作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的页面源代码,不错,地址信息直接加载在页面源码中:
仔细分析页面发现,只需要找HTML源码中夹在 "<ur class="ul1">"和"</url></rd>"之间的部分,就是我们所需要的数据,数据的结构为:
<li>本站主数据:广东省广州市 电信</li>
<li>参考数据一:广东省 电信</li>
每条数据都在分号”:“和</li>之间,做一个简单的处理即可返
下面给出源代码:
注释:上面的public static ArrayList<String> getAddresses(String info) 函数中用到的是正则表达式提取数据:
正则表达式:String regex = ":(.*?)</li>"; 这里解释一下,"."在正则表达式中表示任意字符,"*"表示若干个,"(.*)"表示若干个任意字符(括号起分隔作用,不代表字符),为什么要加个问号编程"(.*?)"呢,如果不加问号,匹配的模式是贪婪的,我们提取到的数据是:
本站主数据:广东省广州市 电信</li>
<li>参考数据一:广东省 电信
会跳过第一个</li>去找最后一个</li>,虽然上面的结果页符合正则表达式,但是它匹配到了尽量多的字符,这个是贪婪模式。加了问号之后,就变为非贪婪模式,会按照尽量短的字符去匹配。
上面那个正则表达式翻译一下可以理解为符合 ":任意字符串</li>"的字符串。
教你如何自己制作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的页面源代码,不错,地址信息直接加载在页面源码中:
1
2
3
4
5
6
7
8
|
<
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>之间,做一个简单的处理即可返
下面给出源代码:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
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>"的字符串。