平时我们需要批量获取百度导航的数据,但有时候大量获取时间较慢。百度给开发者,提供了对接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")
批量算路要比一个个爬距离快很多,另外有些参数可以根据实际情况自行选取。
本文选的是常规路线。