利用IP地址查询接口来查询IP归属地
如果我們在項目中需要獲得用戶的地址,而不僅僅是獲得用戶的IP,為了避免在自己的數(shù)據(jù)庫里添加IP庫,可以直接調(diào)用網(wǎng)上的第3方IP地址查詢接口來查詢IP歸屬地。今兒個在網(wǎng)上了解了這些接口,要么返回XML,要么返回直接查詢結(jié)果,要么不僅僅返回一個需要的查詢結(jié)果,網(wǎng)頁中還有其他不需要的內(nèi)容。那么如何把這些分析挖掘我需要的查詢結(jié)果數(shù)據(jù)呢?在這里我們一一分析吧。
方法1、針對返回XML文件的接口,進行XML文件的讀取和解析并輸出IP歸屬地節(jié)點。
例如有道(yodao)網(wǎng)絡(luò)提供的接口就是返回一個xml文件,在IE中輸入網(wǎng)址:http://www.youdao.com/smartresult-xml/search.s?type=ip&q=60.55.46.222,得到如下的XML文件:
[html]view plaincopy
<?xmlversion="1.0"encoding="gbk"?>
-<smartresult>
-<producttype="ip">
<ip>60.55.46.222</ip>
<location>浙江省寧波市電信</location>
</product>
</smartresult>
可以利用.NET的DataSet對象的ReadXml方法傳入XML的URL地址來讀取這個XML文件,最后解析成一個DataTable,我們輸出location這一列就可以了
完整代碼如下:
[csharp]view plaincopy
usingSystem;
usingSystem.Data;
publicpartialclassDefaultOne:System.Web.UI.Page
{
protectedvoidPage_Load(objectsender,EventArgse)
{
if(Page.IsPostBack==false)
{
//獲得客戶端IP,因為沒上傳到服務(wù)器,因此總是本機地址,127.0.0.1
//stringip=Request.ServerVariables["REMOTE_ADDR"];
stringip="60.55.46.222";
//輸出獲得IP詳細地址方法一
Response.Write(getIpInfoOne(ip));
}
}
///<summary>
///獲得IP詳細地址方法一
///</summary>
///<paramname="ip">ip地址</param>
///<returns>IP詳細地址</returns>
publicstringgetIpInfoOne(stringip)
{
try
{
DataSetds=newDataSet();
//讀取XML數(shù)據(jù)到DataSet
ds.ReadXml("http://www.youdao.com/smartresult-xml/search.s?type=ip&q="+ip);
//獲得location列的數(shù)據(jù)
stringipInfo=ds.Tables[0].Rows[0]["location"].ToString();
ipInfo=ipInfo.Replace("","");
returnipInfo;
}
catch
{
return"";
}
}
}
輸出:浙江省寧波市電信
在如下的調(diào)試視圖查看下就明白了,把節(jié)點product組成一個數(shù)據(jù)表,3列數(shù)據(jù)分別是ip,location,type
方法2、針對直接返回IP歸屬地的接口,通過URL下載網(wǎng)頁內(nèi)容并輸出結(jié)果就可以了。
例如太平洋電腦網(wǎng)絡(luò)提供的接口就是返回IP歸屬地的查詢結(jié)果,在IE中輸入網(wǎng)址:http://whois.pconline.com.cn/ip.jsp?ip=60.55.46.222就直接看到結(jié)果這個很方便我們直接下載別人網(wǎng)頁內(nèi)容,然后把下載到的內(nèi)容在自己網(wǎng)站里輸出就可以了,而不需要過多的處理。太平洋電腦網(wǎng)絡(luò)更多的接口請查看地址:http://whois.pconline.com.cn/
詳細代碼如下:
[csharp]view plaincopy
usingSystem;
usingSystem.Net;
usingSystem.IO;
usingSystem.Text;
publicpartialclassDefaultTwo:System.Web.UI.Page
{
protectedvoidPage_Load(objectsender,EventArgse)
{
if(Page.IsPostBack==false)
{
//獲得客戶端IP,因為沒上傳到服務(wù)器,因此總是本機地址,127.0.0.1
//stringip=Request.ServerVariables["REMOTE_ADDR"];
stringip="60.55.46.222";
//輸出獲得IP詳細地址方法二
Response.Write(getIpInfoTwo(ip));
}
}
///<summary>
///獲得IP詳細地址方法二
///</summary>
///<paramname="ip">ip地址</param>
///<returns>IP詳細地址</returns>
publicstringgetIpInfoTwo(stringip)
{
try
{
stringipInfo=GetStrByUrl("http://whois.pconline.com.cn/ip.jsp?ip="+ip,Encoding.Default);
ipInfo=ipInfo.Replace("","");
returnipInfo;
}
catch
{
return"";
}
}
///<summary>
///通過URL下載網(wǎng)頁HTML,返回HTML代碼
///</summary>
///<paramname="url">要下載的網(wǎng)頁的網(wǎng)址</param>
///<paramname="encoding">要下載的網(wǎng)頁的編碼</param>
///<returns>網(wǎng)頁內(nèi)容</returns>
publicstaticstringGetStrByUrl(stringurl,Encodingencoding)
{
try
{
stringsource="";
WebClientclient=newWebClient();
Streamsr=client.OpenRead(url);
if(sr!=null)
{
StreamReaderstreamr=newStreamReader(sr,encoding);
source=streamr.ReadToEnd();
sr.Close();
streamr.Close();
}
returnsource.Replace("\n","").Replace("\t","").Replace("\r","");
}
catch(System.InvalidOperationExceptionex)
{
return"";
//throwex;
}
}
}
輸出:浙江省寧波市聯(lián)通
方法3、針對不僅僅返回一個需要的查詢結(jié)果,網(wǎng)頁中還有其他不需要的內(nèi)容,通過URL下載網(wǎng)頁內(nèi)容并進行數(shù)據(jù)挖掘。
例如:hao123.com的網(wǎng)站里所鏈接的IP查詢接口,就是ip138.com查詢網(wǎng)的查詢頁面,在IE中輸入網(wǎng)址:http://ip.138ip.cn/ip/60.55.46.222,看到的查詢結(jié)果發(fā)現(xiàn)里面有很多內(nèi)容,如下圖所示,
此時我們需要首先通過URL下載網(wǎng)頁HTML內(nèi)容,然后過濾掉不需要的HTML標簽,最后挖掘出【所在地:】和【在這個IP上的站點】這兩個字符串中的內(nèi)容就可以了,詳細代碼如下:
[csharp]view plaincopy
usingSystem;
usingSystem.Net;
usingSystem.IO;
usingSystem.Text;
usingSystem.Text.RegularExpressions;
publicpartialclassDefaultThree:System.Web.UI.Page
{
protectedvoidPage_Load(objectsender,EventArgse)
{
if(Page.IsPostBack==false)
{
//獲得客戶端IP,因為沒上傳到服務(wù)器,因此總是本機地址,127.0.0.1
//stringip=Request.ServerVariables["REMOTE_ADDR"];
stringip="60.55.46.222";
//輸出獲得IP詳細地址方法三
Response.Write(getIpInfoThree(ip));
}
}
///<summary>
///獲得IP詳細地址方法三
///</summary>
///<paramname="ip">ip地址</param>
///<returns>IP詳細地址</returns>
publicstringgetIpInfoThree(stringip)
{
try
{
stringipInfo=GetStrByUrl("http://ip.138ip.cn/ip/"+ip,Encoding.UTF8);
//過濾字符串中的HTML標記
ipInfo=RepalceHTML(ipInfo);
intbegin=ipInfo.LastIndexOf("所在地:");
intend=ipInfo.IndexOf("在這個IP上的站點");
//截取有用字符串,過濾無用字符串
ipInfo=ipInfo.Substring(begin,end-begin).Replace("","").Replace("所在地:","");
returnipInfo;
}
catch
{
return"";
}
}
///<summary>
///去掉字符串中的HTML標記
///</summary>
///<paramname="source"></param>
///<returns></returns>
publicstaticstringRepalceHTML(stringsource)
{
source=Regex.Replace(source,"<(\\s|\\S)+?>","",RegexOptions.IgnoreCase);
returnsource;
}
///<summary>
///通過URL下載網(wǎng)頁HTML,返回HTML代碼
///</summary>
///<paramname="url">要下載的網(wǎng)頁的網(wǎng)址</param>
///<paramname="encoding">要下載的網(wǎng)頁的編碼</param>
///<returns>網(wǎng)頁內(nèi)容</returns>
publicstaticstringGetStrByUrl(stringurl,Encodingencoding)
{
try
{
stringsource="";
WebClientclient=newWebClient();
Streamsr=client.OpenRead(url);
if(sr!=null)
{
StreamReaderstreamr=newStreamReader(sr,encoding);
source=streamr.ReadToEnd();
sr.Close();
streamr.Close();
}
returnsource.Replace("\n","").Replace("\t","").Replace("\r","");
}
catch(System.InvalidOperationExceptionex)
{
return"";
//throwex;
}
}
}
輸出:浙江省寧波市電信
通過上面三種方式查詢的結(jié)果,有道網(wǎng)絡(luò),ip138網(wǎng)絡(luò)都是浙江省寧波市電信,而太平洋電腦網(wǎng)絡(luò)是浙江省寧波市聯(lián)通,因此網(wǎng)上提供的查詢結(jié)果只是作為個參考。
總結(jié)
以上是生活随笔為你收集整理的利用IP地址查询接口来查询IP归属地的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mismatch详解
- 下一篇: Wyn Enterprise实现Echa