簡介
利用IP得到地理位置信息
在現在這樣的信息化社會,人們在訪問互聯網時總會留下痕跡。其中最多的就是IP數據
怎麼樣來利用IP數據來分析用戶數據呢?其中最好挖掘的肯定非地理位置信息莫屬了
地理位置信息有很多用途,就比如現在新冠疫情在全球大肆傳播,粗略追蹤用戶是否到過某些疫情高發地區等
一般情況下,IP地址定位可以精確到市,這也很不錯了
IP定位API
本次筆者應用了三家地圖的開放平臺API來同時處理數據
目前比較權威的IP數據庫還有阿里雲、淘寶IP地址庫等
以淘寶IP地址庫爲例,其最高支持併發數僅爲1qps,非常的慢,而且目前不知道爲什麼不能用了
而地圖開發者API無論從併發數和日調用上限都能滿足我們的需求
有的還可以精確到區縣級
高德地圖個人認證開發者日調用可達30萬次,併發數200次每秒
高德相關文檔可見https://lbs.amap.com/fn/ip_locate_v4(其他平臺自己搜)
他的精度可以到區縣,但是遇見某些IP很有可能掛掉
但是如果高德+百度+騰訊三家一起用
已經能滿足我們基本需求
而且可以保證IP被最好的分類
筆者試過一個2萬條的數據,三家合用的分類率很高,只有萬分之四三家都識別不出,可見三者合用的好處
使用
註冊並獲得key
去各家官網獲得key,並查看文檔
比如高德地圖:https://lbs.amap.com/api/webservice/summary
初步使用
獲得key之後,我們可以開始我們的一個小應用
在百度中搜索IP,獲得自己的IP
然後試着解析自己的IP
以高德地圖爲例
import json
import requests as rq
url="https://restapi.amap.com/v4/ip?key=你的key"
data={
"ip":"你的IP"
}
ip = rq.get(url,params=data)
這樣,你就可以得到自己的地址數據了
高德地圖還給出了大致的經緯度,並且還比較準,能夠精確到區縣
三者結合使用
三家API中,高德給出的配額最多,但是有一些IP它無法解析,這個時候就要百度地圖和騰訊地圖上陣了
一個可能的轉換程序如下
def ipapi(ip):
url1="https://restapi.amap.com/v4/ip?key=你的key"
data={}
back={}
data["ip"]=ip
api1=rq.get(url1,params=data)
api1=json.loads(api1.text)
if api1['errcode']==0:
back['province']=api1['data']['pcd']['province']
back['city']=api1['data']['pcd']['city']
back['county']=api1['data']['pcd']['county']
back['lng']=api1['data']['lng']
back['lat']=api1['data']['lat']
back['code']='Gaode'
return back
url2="http://api.map.baidu.com/location/ip?ak=你的key&coor=你的編碼方式"
data={}
back={}
data["ip"]=ip
api2=rq.get(url2,params=data)
api2=json.loads(api2.text)
if api2['status']==0:
back['province']=api2['content']['address_detail']['province']
back['city']=api2['content']['address_detail']['city']
back['county']='NULL'
back['lng']=api2['content']['point']['x']
back['lat']=api2['content']['point']['y']
back['code']='Baidu'
return back
url3="https://apis.map.qq.com/ws/location/v1/ip?key=你的key"
data={}
back={}
data["ip"]=ip
api3=rq.get(url3,params=data)
api3=json.loads(api3.text)
if api3['status']==0:
back['province']=api3['result']['ad_info']['province']
back['city']=api3['result']['ad_info']['city']
back['county']='NULL'
back['lng']=api3['result']['location']['lng']
back['lat']=api3['result']['location']['lat']
back['code']='Tencent'
return back
qsz={'province': 'NULL',
'city': 'NULL',
'county': 'NULL',
'lng': 'NULL',
'lat': 'NULL',
'code': 'NULL'}
return qsz
正常解析的情況下,會返回一個包含所需信息的字典
province是省
city是市
county是縣區(只有高德地圖有)
lng經度
lat維度
code解析服務商
有些IP強到3家都無法解析,這時返回一個空字典而不是None顯然是保持連續性的更好選擇
應用於我們的數據
假設含有信息的DataFrame共有cols行,其中IP地址在第二列
你可以這樣使用
ips=[]
for i in range(cols):
ips.append(ipapi(data.iloc[i,1])
print(i)#把i輸出,好知道進度
你會得到一個字典列表,我們用pandas將其轉換爲DataFrame
data2=pd.DataFrame(ips)
print(data2.head())
可以看到這時的data2包含了經緯度和定位信息,我們將其與原DataFrame連接
data3= pd.concat([data,data2],axis=1)
這時我們就成功的解析了IP地址