• 利用IP地址查询接口来查询IP归属地


    如果我们在项目中需要获得用户的地址,而不仅仅是获得用户的IP,为了避免在自己的数据库里添加IP库,可以直接调用网上的第3方IP地址查询接口来查询IP归属地。今儿个在网上了解了这些接口,要么返回XML,要么返回直接查询结果,要么不仅仅返回一个需要的查询结果,网页中还有其他不需要的内容。那么如何把这些分析挖掘我需要的查询结果数据呢?在这里我们一一分析吧。

    方法1、针对返回XML文件的接口,进行XML文件的读取和解析并输出IP归属地节点。

    例如有道(yodao)网络提供的接口就是返回一个xml文件,在IE中输入网址:http://www.youdao.com/smartresult-xml/search.s?type=ip&q=60.55.46.222,得到如下的XML文件:

    [html] view plaincopy
     
    1.   <?xml version="1.0" encoding="gbk" ?>   
    2. <smartresult>  
    3. <product type="ip">  
    4.   <ip>60.55.46.222</ip>   
    5.   <location>浙江省宁波市 电信</location>   
    6.   </product>  
    7.   </smartresult>  

    可以利用.NET的DataSet对象的ReadXml方法传入XML的URL地址来读取这个XML文件,最后解析成一个DataTable,我们输出location这一列就可以了

    完整代码如下:

    [csharp] view plaincopy
     
    1. using System;  
    2. using System.Data;  
    3.   
    4. public partial class DefaultOne : System.Web.UI.Page  
    5. {  
    6.     protected void Page_Load(object sender, EventArgs e)  
    7.     {  
    8.         if (Page.IsPostBack == false)  
    9.         {  
    10.             //获得客户端IP,因为没上传到服务器,因此总是本机地址,127.0.0.1   
    11.             //string ip=Request.ServerVariables["REMOTE_ADDR"];  
    12.   
    13.             string ip = "60.55.46.222";  
    14.   
    15.             //输出获得IP详细地址方法一  
    16.             Response.Write(getIpInfoOne(ip));  
    17.         }  
    18.     }  
    19.   
    20.     /// <summary>  
    21.     /// 获得IP详细地址方法一  
    22.     /// </summary>  
    23.     /// <param name="ip">ip地址</param>  
    24.     /// <returns>IP详细地址</returns>  
    25.     public string getIpInfoOne(string ip)  
    26.     {  
    27.         try  
    28.         {  
    29.             DataSet ds = new DataSet();  
    30.   
    31.             //读取XML数据到DataSet  
    32.             ds.ReadXml("http://www.youdao.com/smartresult-xml/search.s?type=ip&q=" + ip);  
    33.   
    34.             //获得location列的数据  
    35.             string ipInfo = ds.Tables[0].Rows[0]["location"].ToString();  
    36.             ipInfo = ipInfo.Replace(" """);  
    37.             return ipInfo;  
    38.         }  
    39.         catch  
    40.         {  
    41.             return "";  
    42.         }  
    43.     }  
    44. }  

    输出:浙江省宁波市电信

    在如下的调试视图查看下就明白了,把节点product组成一个数据表,3列数据分别是ip,location,type


    方法2、针对直接返回IP归属地的接口,通过URL下载网页内容并输出结果就可以了。

    例如太平洋电脑网络提供的接口就是返回IP归属地的查询结果,在IE中输入网址:http://whois.pconline.com.cn/ip.jsp?ip=60.55.46.222就直接看到结果这个很方便我们直接下载别人网页内容,然后把下载到的内容在自己网站里输出就可以了,而不需要过多的处理。太平洋电脑网络更多的接口请查看地址:http://whois.pconline.com.cn/

    详细代码如下:

    [csharp] view plaincopy
     
    1. using System;  
    2. using System.Net;  
    3. using System.IO;  
    4. using System.Text;  
    5.   
    6. public partial class DefaultTwo : System.Web.UI.Page  
    7. {  
    8.     protected void Page_Load(object sender, EventArgs e)  
    9.     {  
    10.         if (Page.IsPostBack == false)  
    11.         {  
    12.             //获得客户端IP,因为没上传到服务器,因此总是本机地址,127.0.0.1   
    13.             //string ip=Request.ServerVariables["REMOTE_ADDR"];  
    14.   
    15.             string ip = "60.55.46.222";  
    16.   
    17.             //输出获得IP详细地址方法二  
    18.             Response.Write(getIpInfoTwo(ip));  
    19.         }  
    20.     }  
    21.   
    22.     /// <summary>  
    23.     /// 获得IP详细地址方法二  
    24.     /// </summary>  
    25.     /// <param name="ip">ip地址</param>  
    26.     /// <returns>IP详细地址</returns>  
    27.     public string getIpInfoTwo(string ip)  
    28.     {  
    29.         try  
    30.         {  
    31.             string ipInfo = GetStrByUrl("http://whois.pconline.com.cn/ip.jsp?ip=" + ip, Encoding.Default);  
    32.             ipInfo = ipInfo.Replace(" """);  
    33.             return ipInfo;  
    34.         }  
    35.         catch  
    36.         {  
    37.             return "";  
    38.         }  
    39.     }  
    40.   
    41.     /// <summary>  
    42.     ///通过URL下载网页HTML,返回HTML代码  
    43.     /// </summary>  
    44.     /// <param name="url">要下载的网页的网址</param>  
    45.     /// <param name="encoding">要下载的网页的编码</param>  
    46.     /// <returns>网页内容</returns>  
    47.     public static string GetStrByUrl(string url, Encoding encoding)  
    48.     {  
    49.         try  
    50.         {  
    51.             string source = "";  
    52.             WebClient client = new WebClient();  
    53.             Stream sr = client.OpenRead(url);  
    54.             if (sr != null)  
    55.             {  
    56.                 StreamReader streamr = new StreamReader(sr, encoding);  
    57.                 source = streamr.ReadToEnd();  
    58.                 sr.Close();  
    59.                 streamr.Close();  
    60.             }  
    61.             return source.Replace("\n""").Replace("\t""").Replace("\r""");  
    62.         }  
    63.         catch (System.InvalidOperationException ex)  
    64.         {  
    65.             return "";  
    66.             //throw ex;  
    67.         }  
    68.     }  
    69. }  

    输出:浙江省宁波市联通
    方法3、针对不仅仅返回一个需要的查询结果,网页中还有其他不需要的内容,通过URL下载网页内容并进行数据挖掘。

    例如:hao123.com的网站里所链接的IP查询接口,就是ip138.com查询网的查询页面,在IE中输入网址:http://ip.138ip.cn/ip/60.55.46.222,看到的查询结果发现里面有很多内容,如下图所示,

    此时我们需要首先通过URL下载网页HTML内容,然后过滤掉不需要的HTML标签,最后挖掘出【所在地:】和【在这个IP上的站点】这两个字符串中的内容就可以了,详细代码如下:

    [csharp] view plaincopy
     
    1. using System;  
    2. using System.Net;  
    3. using System.IO;  
    4. using System.Text;  
    5. using System.Text.RegularExpressions;  
    6.   
    7. public partial class DefaultThree : System.Web.UI.Page  
    8. {  
    9.     protected void Page_Load(object sender, EventArgs e)  
    10.     {  
    11.         if (Page.IsPostBack == false)  
    12.         {  
    13.             //获得客户端IP,因为没上传到服务器,因此总是本机地址,127.0.0.1   
    14.             //string ip=Request.ServerVariables["REMOTE_ADDR"];  
    15.   
    16.             string ip = "60.55.46.222";  
    17.   
    18.             //输出获得IP详细地址方法三  
    19.             Response.Write(getIpInfoThree(ip));  
    20.         }  
    21.     }  
    22.   
    23.     /// <summary>  
    24.     /// 获得IP详细地址方法三  
    25.     /// </summary>  
    26.     /// <param name="ip">ip地址</param>  
    27.     /// <returns>IP详细地址</returns>  
    28.     public string getIpInfoThree(string ip)  
    29.     {  
    30.         try  
    31.         {  
    32.   
    33.             string ipInfo = GetStrByUrl("http://ip.138ip.cn/ip/" + ip, Encoding.UTF8);  
    34.   
    35.             //过滤字符串中的HTML标记  
    36.             ipInfo = RepalceHTML(ipInfo);  
    37.             int begin = ipInfo.LastIndexOf("所在地:");  
    38.             int end = ipInfo.IndexOf("在这个IP上的站点");  
    39.   
    40.             //截取有用字符串,过滤无用字符串  
    41.             ipInfo = ipInfo.Substring(begin, end - begin).Replace(" """).Replace("所在地:""");  
    42.             return ipInfo;  
    43.         }  
    44.         catch  
    45.         {  
    46.             return "";  
    47.         }  
    48.     }  
    49.   
    50.     /// <summary>  
    51.     /// 去掉字符串中的HTML标记  
    52.     /// </summary>  
    53.     /// <param name="source"></param>  
    54.     /// <returns></returns>  
    55.     public static string RepalceHTML(string source)  
    56.     {  
    57.         source = Regex.Replace(source, "<(\\s|\\S)+?>""", RegexOptions.IgnoreCase);  
    58.         return source;  
    59.     }  
    60.   
    61.     /// <summary>  
    62.     ///通过URL下载网页HTML,返回HTML代码  
    63.     /// </summary>  
    64.     /// <param name="url">要下载的网页的网址</param>  
    65.     /// <param name="encoding">要下载的网页的编码</param>  
    66.     /// <returns>网页内容</returns>  
    67.     public static string GetStrByUrl(string url, Encoding encoding)  
    68.     {  
    69.         try  
    70.         {  
    71.             string source = "";  
    72.             WebClient client = new WebClient();  
    73.             Stream sr = client.OpenRead(url);  
    74.             if (sr != null)  
    75.             {  
    76.                 StreamReader streamr = new StreamReader(sr, encoding);  
    77.                 source = streamr.ReadToEnd();  
    78.                 sr.Close();  
    79.                 streamr.Close();  
    80.             }  
    81.             return source.Replace("\n""").Replace("\t""").Replace("\r""");  
    82.         }  
    83.         catch (System.InvalidOperationException ex)  
    84.         {  
    85.             return "";  
    86.             //throw ex;  
    87.         }  
    88.     }  
    89. }  

    输出:浙江省宁波市电信

    通过上面三种方式查询的结果,有道网络,ip138网络都是浙江省宁波市电信,而太平洋电脑网络是浙江省宁波市联通,因此网上提供的查询结果只是作为个参考。

  • 相关阅读:
    《A First Course in Mathematical Modeling》-chaper1-差分方程建模
    《数学竞赛辅导》-一元函数积分学-7.24
    《University Calculus》-chape4-导数的应用-极值点的二阶导数检验法
    《A First Course in Probability》-chaper1-组合分析-方程整数解的个数
    《训练指南》——7.24
    《数学竞赛辅导》-一元函数微分学-7.23
    《University Calculus》-chape4-导数的应用-微分中值定理
    《训练指南》——7.21
    #424 Div2 E
    #424 Div2 C
  • 原文地址:https://www.cnblogs.com/xyzhuzhou/p/2984824.html
Copyright © 2020-2023  润新知