平时我们需要批量获取百度导航的数据,但有时候大量获取时间较慢。百度给开发者,提供了对接API的获取数据功能。(现额度已降低至每天5000,22年8月之前是每天30000额度)如果某个项目如果试用的比较多,可以进行额度申请,可以提供使用额度。
百度开发者文档
所有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")
批量算路要比一个个爬距离快很多,另外有些参数可以根据实际情况自行选取。
本文选的是常规路线。