利用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网络都是浙江省宁波市电信,而太平洋电脑网络是浙江省宁波市联通,因此网上提供的查询结果只是作为个参考。

原文地址:https://www.cnblogs.com/xyzhuzhou/p/2984824.html