zoukankan      html  css  js  c++  java
  • 利用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文件:

      <?xml version="1.0" encoding="gbk" ?> 
    - <smartresult>
    - <product type="ip">
      <ip>60.55.46.222</ip> 
      <location>浙江省宁波市 电信</location> 
      </product>
      </smartresult>

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

    完整代码如下:

    using System;
    using System.Data;
    
    public partial class DefaultOne : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Page.IsPostBack == false)
            {
                //获得客户端IP,因为没上传到服务器,因此总是本机地址,127.0.0.1 
                //string ip=Request.ServerVariables["REMOTE_ADDR"];
    
                string ip = "60.55.46.222";
    
                //输出获得IP详细地址方法一
                Response.Write(getIpInfoOne(ip));
            }
        }
    
        /// <summary>
        /// 获得IP详细地址方法一
        /// </summary>
        /// <param name="ip">ip地址</param>
        /// <returns>IP详细地址</returns>
        public string getIpInfoOne(string ip)
        {
            try
            {
                DataSet ds = new DataSet();
    
                //读取XML数据到DataSet
                ds.ReadXml("http://www.youdao.com/smartresult-xml/search.s?type=ip&q=" + ip);
    
                //获得location列的数据
                string ipInfo = ds.Tables[0].Rows[0]["location"].ToString();
                ipInfo = ipInfo.Replace(" ", "");
                return ipInfo;
            }
            catch
            {
                return "";
            }
        }
    }

    输出:浙江省宁波市电信

    在如下的调试视图查看下就明白了,把节点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/

    详细代码如下:

    using System;
    using System.Net;
    using System.IO;
    using System.Text;
    
    public partial class DefaultTwo : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Page.IsPostBack == false)
            {
                //获得客户端IP,因为没上传到服务器,因此总是本机地址,127.0.0.1 
                //string ip=Request.ServerVariables["REMOTE_ADDR"];
    
                string ip = "60.55.46.222";
    
                //输出获得IP详细地址方法二
                Response.Write(getIpInfoTwo(ip));
            }
        }
    
        /// <summary>
        /// 获得IP详细地址方法二
        /// </summary>
        /// <param name="ip">ip地址</param>
        /// <returns>IP详细地址</returns>
        public string getIpInfoTwo(string ip)
        {
            try
            {
                string ipInfo = GetStrByUrl("http://whois.pconline.com.cn/ip.jsp?ip=" + ip, Encoding.Default);
                ipInfo = ipInfo.Replace(" ", "");
                return ipInfo;
            }
            catch
            {
                return "";
            }
        }
    
        /// <summary>
        ///通过URL下载网页HTML,返回HTML代码
        /// </summary>
        /// <param name="url">要下载的网页的网址</param>
        /// <param name="encoding">要下载的网页的编码</param>
        /// <returns>网页内容</returns>
        public static string GetStrByUrl(string url, Encoding encoding)
        {
            try
            {
                string source = "";
                WebClient client = new WebClient();
                Stream sr = client.OpenRead(url);
                if (sr != null)
                {
                    StreamReader streamr = new StreamReader(sr, encoding);
                    source = streamr.ReadToEnd();
                    sr.Close();
                    streamr.Close();
                }
                return source.Replace("\n", "").Replace("\t", "").Replace("\r", "");
            }
            catch (System.InvalidOperationException ex)
            {
                return "";
                //throw ex;
            }
        }
    }

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

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

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

    using System;
    using System.Net;
    using System.IO;
    using System.Text;
    using System.Text.RegularExpressions;
    
    public partial class DefaultThree : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Page.IsPostBack == false)
            {
                //获得客户端IP,因为没上传到服务器,因此总是本机地址,127.0.0.1 
                //string ip=Request.ServerVariables["REMOTE_ADDR"];
    
                string ip = "60.55.46.222";
    
                //输出获得IP详细地址方法三
                Response.Write(getIpInfoThree(ip));
            }
        }
    
        /// <summary>
        /// 获得IP详细地址方法三
        /// </summary>
        /// <param name="ip">ip地址</param>
        /// <returns>IP详细地址</returns>
        public string getIpInfoThree(string ip)
        {
            try
            {
    
                string ipInfo = GetStrByUrl("http://ip.138ip.cn/ip/" + ip, Encoding.UTF8);
    
                //过滤字符串中的HTML标记
                ipInfo = RepalceHTML(ipInfo);
                int begin = ipInfo.LastIndexOf("所在地:");
                int end = ipInfo.IndexOf("在这个IP上的站点");
    
                //截取有用字符串,过滤无用字符串
                ipInfo = ipInfo.Substring(begin, end - begin).Replace("&nbsp;", "").Replace("所在地:", "");
                return ipInfo;
            }
            catch
            {
                return "";
            }
        }
    
        /// <summary>
        /// 去掉字符串中的HTML标记
        /// </summary>
        /// <param name="source"></param>
        /// <returns></returns>
        public static string RepalceHTML(string source)
        {
            source = Regex.Replace(source, "<(\\s|\\S)+?>", "", RegexOptions.IgnoreCase);
            return source;
        }
    
        /// <summary>
        ///通过URL下载网页HTML,返回HTML代码
        /// </summary>
        /// <param name="url">要下载的网页的网址</param>
        /// <param name="encoding">要下载的网页的编码</param>
        /// <returns>网页内容</returns>
        public static string GetStrByUrl(string url, Encoding encoding)
        {
            try
            {
                string source = "";
                WebClient client = new WebClient();
                Stream sr = client.OpenRead(url);
                if (sr != null)
                {
                    StreamReader streamr = new StreamReader(sr, encoding);
                    source = streamr.ReadToEnd();
                    sr.Close();
                    streamr.Close();
                }
                return source.Replace("\n", "").Replace("\t", "").Replace("\r", "");
            }
            catch (System.InvalidOperationException ex)
            {
                return "";
                //throw ex;
            }
        }
    }

    输出:浙江省宁波市电信

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

    本文非笔者原创,参考自:http://blog.csdn.net/aspnet2002web/article/details/7561654

  • 相关阅读:
    修复跨站攻击 php
    nginx 网站目录重写
    centos Linux 统计某个文件夹占用空间大小
    FCKeditor使用方法技术详解
    使用stl超时的问题
    __int64 和long long
    POJ1426 Find The Multiple
    搜索BFS---hdu2717
    memset的用法
    汉诺塔 HDU2064 (递归)注意类型!!longlong
  • 原文地址:https://www.cnblogs.com/jkyweb/p/3054129.html
Copyright © 2011-2022 走看看