數據挖掘:使用python+requests結合高德+百度+騰訊地圖API處理IP數據,獲得IP地理位置信息

簡介

利用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地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章