曾經作網站類型的程序時,常常須要收集客戶端的訪問數據,而後加以分析。這須要一個Ip數據庫,數據表中顯示Ip所在的省份市區等信息。網絡上有流傳的Ip純真數據庫,一些公開的Web服務也能夠查詢Ip地址信息,可是24小時內超過查詢次數就須要購買商業受權,網站myds.net上提供了Ip數據庫下載,不過須要收取60元人民幣。php
最後一種方法,也就是不花錢的辦法,用C#調用淘寶的Ip地址庫,準確率高,並且查詢次數不限制。css
先參考網方提供的文檔:html
淘寶IP地址庫,提供API 數據庫
地址:http://ip.taobao.com/ json
提供的服務包括:
1. 根據用戶提供的IP地址,快速查詢出該IP地址所在的地理信息和地理相關的信息,包括國家、省、市和運營商。
2. 用戶能夠根據本身所在的位置和使用的IP地址更新咱們的服務內容。
優點:
1. 提供國家、省、市、縣、運營商全方位信息,信息維度廣,格式規範。
2. 提供完善的統計分析報表,省準確度超過99.8%,市準確度超過96.8%,數據質量有保障。 數組
接口說明 網絡
1. 請求接口(GET):
http://ip.taobao.com/service/getIpInfo.php?ip=[ip地址字串]
2. 響應信息:
(json格式的)國家 、省(自治區或直轄市)、市(縣)、運營商
3. 返回數據格式:
{"code":0,"data":{"ip":"210.75.225.254","country":"\u4e2d\u56fd","area":"\u534e\u5317",
"region":"\u5317\u4eac\u5e02","city":"\u5317\u4eac\u5e02","county":"","isp":"\u7535\u4fe1",
"country_id":"86","area_id":"100000","region_id":"110000","city_id":"110000",
"county_id":"-1","isp_id":"100017"}}
其中code的值的含義爲,0:成功,1:失敗。 多線程
StackOverflow上面有一篇文章,講解如何枚舉全部的互聯網Ip地址。請參考 C# Enumerate IP addresses in a range - Stack Overflow性能
請看下面的Ip地址參數例子網站
'192.0.2.1' 一個Ip地址
'192.0.2.0-31' 枚舉192.0.2.0-192.0.2.31 一共32個Ip地址
'192.0.2-3.1-254' 枚舉192.0.2.1-192.0.2.254和 192.0.3.1-192.0.3.254 一共254個IP地址
'0-255.0-255.0-255.0-255' 枚舉互聯網上全部的IPv4地址
代碼中的調用方法
string pattern="200.64-71.0-255.0-255"; IPRange ipRange=new IPRange(pattern); List<IPAddress> addresses=ipRange.GetAllIP();
這樣,就獲得了全部的Ip地址。
參考下面的代碼,獲得每一個Ip地址的查詢結果
WebRequest request = HttpWebRequest.Create("http://ip.taobao.com/service/getIpInfo.php?ip-200.9.210.200"); request.Credentials = CredentialCache.DefaultCredentials; HttpWebResponse response = (HttpWebResponse) request.GetResponse(); Stream dataStream = response.GetResponseStream(); StreamReader reader = new StreamReader(dataStream); string responseFromServer = reader.ReadToEnd(); reader.Close(); dataStream.Close(); response.Close();
這裏爲了提升性能,能夠用多線程,也能夠並行方法,以下面的代碼例子
Parallel.ForEach(addresses, (address)=> { …… });
把Json變成.NET Object有幾種方法。著名的JSON.NET天然很容易就實現,可是不我想依賴第三方的庫,.NET內置的JavaScriptSerializer能夠實現這個目的。
JavaScriptSerializer serializer=new JavaScriptSerializer(); object obj=serializer.Deserialize<object>(json); Dictionary<string,object> ip=obj as Dictionary<string,object>
Json解析的結果,是二個Dictionary,第一個默認是0,我取第二個字典項的Value的值,它是一個字符串Array
因而,根據這個字符串數組,生成表的列。
先建立一個結果表,用於存放每一個Ip地址採集的數據
DataTable final=new DataTable() ...json => DataTable table; if(final.Columns.Count==0) final=table.Clone(); final.Merge(table);
再建立一個AccessHelper類型,能夠直接寫數據到文件中。
AccessHelper access=new AccessHelper(@"C:\Data\Ip.accdb"); access.AppendData(final);
它會根據DataTable的結構,自動生成建立Access表結構的SQL語句,再把DataTable中的數據以參數的方式插入到
數據表中。 這裏應該注意,不該該用Microsoft.Jet.Oledb4.0,Jet很早就中止開發,而且不能在x64的電腦中運行。一種辦法是要將Target設成x86,或是使用Access Runtime 2007,它提供了Microsft.Ace.12.0,這個新的驅動程序,能夠運行於x64系統中,而且支持新的accdb格式的數據庫。