教你如何自己制作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的页面源代码,不错,地址信息直接加载在页面源码中:
XML/HTML code
?
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>之间,做一个简单的处理即可返
下面给出源代码:

Java code
?
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>"的字符串。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值