调用百度批量算路功能介绍

文摘   社会   2024-11-12 08:32   湖北  
 

平时我们需要批量获取百度导航的数据,但有时候大量获取时间较慢。百度给开发者,提供了对接API的获取数据功能。(现个人用户额度已降低至每天5000次)如果某个项目如果试用的比较多,可以进行额度申请,可以提供使用额度。

百度开发者文档

所有API获取数据都有对应的文档。以下是批量算路的文档,其对应的参数都很详细。

快速获取距离矩阵数据

现需要获取50个点,两两之间的距离矩阵和时间矩阵数据。使用百度批量算路功能获取该数据。

网点数据

基础代码介绍

我用了4个AK码,2分钟爬完了50*50=2500条数据。若能提高百度并发,其爬取时间可以更快,但是AK码并发上限是30(更高的并发需要花钱或者个人去申请)。

对应爬取之后的数据:距离矩阵50*50

对应爬取之后的数据:时间矩阵50*50

函数说明1:获取百度批量算路的数据,如果爬的太快百度会限制,自动停一秒换下一个AK码(可以多用几次try,except)

#获取百度批量算路的数据
def baidu_pl(p,q,AK):
    tm.sleep(1)
    url_drive="https://api.map.baidu.com/routematrix/v2/driving?output=json&tactics=11&origins=\
{}&destinations={}&ak={}"
.format(p,q,AK)
    try:
        result_drive=json.loads(urlopen(url_drive).read())
        dis=[]
        time=[]
        for i in range(len(result_drive['result'])):
            dis.append(result_drive['result'][i]['distance']['value']/1000)
            time.append(result_drive['result'][i]['duration']['value']/3600)
    except:
            tm.sleep(1)
            url_drive="https://api.map.baidu.com/routematrix/v2/driving?output=json&tactics=11&origins=\
{}&destinations={}&ak={}"
.format(p,q,AKall[0%len(AKall)])
            result_drive=json.loads(urlopen(url_drive).read())
            dis=[]
            time=[]
            for i in range(len(result_drive['result'])):
                dis.append(result_drive['result'][i]['distance']['value']/1000)
                time.append(result_drive['result'][i]['duration']['value']/3600)                               
    return  dis,time
    

函数说明2:把查询完的数据按矩阵的形式输出至行列,一次查29个(百度免费版上限是30)

def plchaxun(df,m):
    q=''
    q1=''
    y=len(df)-1
    rr=29#系数,一次查多少个
    p=str(df.纬度[m])+','+str(df.经度[m])
    if y+1<rr :
        for mm in range(0,y):
            q+=str(df.纬度[mm])+','+str(df.经度[mm])+"|"
        q=q+str(df.纬度[y])+','+str(df.经度[y])
        dis0,time0=baidu_pl(p,q,AK)
    elif (y+1)%rr>0:
        dis0=[]
        time0=[]
        for i in range((y+1)//rr):
            q2=''
            for mm in range(rr*i,rr*(i+1)-1):
                q2+=str(df.纬度[mm])+','+str(df.经度[mm])+"|"
            q2=q2+str(df.纬度[rr*(i+1)-1])+','+str(df.经度[rr*(i+1)-1])
            #print(q2)
            disu,timeu=baidu_pl(p,q2,AK)
            dis0+= disu
            time0+=timeu
        for pp in range(((y+1)//rr)*rr,y):
            q1+=str(df.纬度[pp])+','+str(df.经度[pp])+"|"
        q1=q1+str(df.纬度[y])+','+str(df.经度[y])
        disu1,timeu1=baidu_pl(p,q1,AK)
        dis0+= disu1
        time0+=timeu1
    else:
        dis0=[]
        time0=[]
        for i in range((y+1)//rr):
            q2=''
            for mm in range(rr*i,rr*(i+1)-1):
                q2+=str(df.纬度[mm])+','+str(df.经度[mm])+"|"
            q2=q2+str(df.纬度[rr*(i+1)-1])+','+str(df.经度[rr*(i+1)-1])
            disu,timeu=baidu_pl(p,q2,AK)
            print('123'+str(i))
            dis0+= disu
            time0+=timeu
    #print(dis0)
    return dis0,time0

函数说明3:查询完的数据按矩阵形式输出至行列

for kname in name:
    df=pd.read_excel('0.经纬度坐标\网点经纬度.xlsx',sheet_name=kname)
    df1 =pd.DataFrame(0.01, index=range(len(df)), columns=range(len(df)))
    df2 =pd.DataFrame(0.01, index=range(len(df)), columns=range(len(df)))
    for i in range(0,len(df)):
        AK=AKall[i%len(AKall)]
        dis1, time1=plchaxun(df,i)
        df1.iloc[i,:]=dis1
        df2.iloc[i,:]=time1
        #print(i,AK)
    df1.columns=df.网点名称
    df1.index=df.网点名称
    df2.columns=df.网点名称
    df2.index=df.网点名称
    print(kname+'完成')
    df1.to_excel("1.距离及时间矩阵/disbd"+kname+".xlsx")
    df2.to_excel("1.距离及时间矩阵/timebd"+kname+".xlsx")

批量算路要比一个个爬距离快很多,另外有些参数可以根据实际情况自行选取。

本文选的是常规路线。

Python学习杂记
数据分析与挖掘、运筹优化、机器学习、AI 、数据可视化等。
 最新文章