可能會遇到這樣的問題,服務器或者系統經常被掃描,通過IP地址我們只能查到某一個市級城市,如下圖:
當我們想具體到街道甚至門牌號,該怎么辦???
偶然間發現百度地圖有高精度IP定位API的接口,通過該接口我們可以通過IP地址定位到具體的地理位置,甚至能精確到門牌號及周圍的標志性建築。該接口的說明地址為:lbsyun.baidu.com/index.php?title=webapi/high-acc-ip
若想要使用該接口進行查詢,必須先申請一個密鑰(AK),如下圖:
申請過程就不進行說明了。API的接口參數說明和返回參數說明也不過多的介紹,大家可以看一看。因為我想返回基礎定位結果+地址信息+POI信息,所以我將請求參數extensions的值設置為3。一次完整的http請求為:api.map.baidu.com/highacciploc/v1?qcip=183.55.116.90&qterm=pc&ak=“你的 密鑰(AK)”&coord=bd09ll&extensions=3 。請求結果如下圖:
結果為json格式數據:
我們需要的字段為:content字段里面的formatted_address。當然我們也可以將location里面的經度和緯度提取出來從而顯示在地圖上面。有的IP地址會返回pois數據,比如:183.55.116.95。返回參數如下:
此時我們可以把pois字段也提取出來,值得注意的是pois為數組,我們可以遍歷數組數據。
通過上面的分析,用python簡單的寫了一個腳本,具體代碼如下:
1 # -*- coding:utf-8 -*- 2 3 # author:allen權 4 5 import sys 6 7 import urllib2 8 9 import json 10 11 def get_ip_information(ip): 12 13 url='http://api.map.baidu.com/highacciploc/v1?qcip='+ip+'&qterm=pc&ak='你的密鑰(AK)'&coord=bd09ll&extensions=3' 14 15 poiss='' 16 17 request = urllib2.Request(url) 18 19 page = urllib2.urlopen(request, timeout=10) 20 21 data_json = page.read() 22 23 data_dic = json.loads(data_json) 24 25 if(data_dic.has_key(\\\\"content\\\\")): 26 27 content=data_dic[\\\\"content\\\\"] 28 29 address_component=content[\\\\"address_component\\\\"] 30 31 formatted_address=content[\\\\"formatted_address\\\\"] 32 33 print \\\\"該IP地址的具體位置為:\\\\" 34 35 print address_component[\\\\"country\\\\"] 36 37 print formatted_address 38 39 if (content.has_key(\\\\"pois\\\\")): 40 41 print \\\\"該IP地址附近POI信息如下:\\\\" 42 43 pois = content[\\\\"pois\\\\"] 44 45 for index in range(len(pois)): 46 47 pois_name = pois[index][\\\\"name\\\\"] 48 49 pois_address = pois[index][\\\\"address\\\\"] 50 51 print pois_name, pois_address 52 53 else: 54 55 print 'IP地址定位失敗!!!' 56 57 if __name__ == '__main__': 58 59 get_ip_information('183.55.116.95')
大家把腳本上面的參數ak值改為自己的密鑰即可。測試截圖如下:
再放一張自己IP的測試截圖:
確實精確到了路名,很准確,雖然沒有pois的信息。
最后聲明一下,成功率:綜合定位成功率 65% ,精度:90% 誤差 80m 以內;95% 誤差 350m。這是官方給出的數據,所說有一定的概率是查詢失敗的!!!!