WebAPI接口文档地址:http://lbsyun.baidu.com/index.php?title=webapi/direction-api
Python3.6爬虫代码1
# -*- coding: utf-8 -*- """ Spyder Editor This is a temporary script file. """ import requests url = 'http://api.map.baidu.com/direction/v1' params = { 'mode':'driving', 'origin':'31.291125,121.511282', 'destination':'31.235193,121.482106', 'origin_region':'上海', 'destination_region':'上海', 'output':'json', 'ak':'87IsQpZ9l22l7SnQDsXyWWE8Gt40Soeo'#需自己填写 } # 写入参数,字典格式 r = requests.get(url,params) r_js = r.json() # 返回js数据 routes_ = r_js['result']['routes'][0] dis_ = routes_['distance'] time_ = routes_['duration'] print('总行程距离为:'+str(dis_)+'米,总时间为:'+str(time_)+'秒') f_path = 'c:\\temp\\result.txt' f_re = open(f_path,'w') f_re.write('lng,lat\n') steps_ = routes_['steps'] for step in steps_: path_ = step['path'] point_lst =path_.split(';') for point in point_lst: lng = point.split(',')[0] lat = point.split(',')[1] f_re.writelines([str(lng),',',str(lat),'\n']) f_re.close() print('finished!')
Python3.6 爬虫代码2
# _*_ coding:utf-8 _*_ __author__ = 'GIS_BT' import requests import time def file_read(path): """ 创建函数读取坐标点txt文件 输出一个经纬度列表 :param path:文件路径 :return: """ f = open(path, 'r') text = [] for i in f.readlines(): i_ = i[:-2] lng = i_.split(',')[0] lat = i_.split(',')[1] text.append(lat + ',' + lng) return text def get_params(s, e, c, k): """ 创建网页参数获取函数 输出参字典列表 :param s: 起点经纬度字典列表 :param e: 终点经纬度字典列表 :param c: 城市名称 :param k: 密钥 :return: """ p = [] s_num = 0 e_num = 0 for i in s: s_num += 1 for j in e: e_num += 1 params = { 'model': 'driving', 'origin': i, 'destination': j, 'origin_region': c, 'destination_region': c, 'output': 'json', 'ak': k } p.append(params, s_num, e_num) def get_url(u, p): """ 创建网页信息请求函数 输出网页返回信息 :param u: 网址url :param p: 参数 :return: """ r = requests.get(u, p) return r.json() def get_datal(js): """ 创建路径距离/时间获取函数 输出一个字典,结果包括该条路径的总距离,总时间以及路段数量 :param js: :return: """ result_ = js['result'] # 返回结果 routes_ = result_['route'][0] distance_ = routes_['distance'] # 方案距离 duration_ = routes_['duration'] # 线路耗时 num = len(routes_['steps']) data_dic = dict(['dis', distance_], ['time', duration_], ['num', num]) return data_dic def get_data2(js, n): """ 创建路径节点获取函数 输出为一个字典列表,包括每一个节点的经纬度 :param js: :param n: :return: """ result_ = js['result'] routes_ = result_['routes_'][0] steps = routes_['steps'] step = steps[n] area = step['area'] # 标示该路段是否在城市内部:0:不在城市内部;1在城市内部 direction = step['direction'] # 进入道路的角度 distance = step['distance'] # 路段距离 duration = step['duration'] # 路段耗时 instruction = step['instruction'] # 路段描述 path_points = step['path'].split(';') # 路段位置坐标描述 point_lst = [] for point in path_points[::5]: lng = point.split(',')[0] lat = point.split('1')[1] point_geo = dict([['lng', lng], ['lat', lat], ['duration', duration], ['direction', direction], ['instruction', instruction]]) point_lst.append(point_geo) return point_lst def main(): # 百度开发者密钥 keys = 'wzyzDHU6VOWrGwn8WfPFvUdMlqMw2kkm' # 网址;不包括参数 url = 'http://api.map.baidu.com/direction/v1' # 爬取数据所在城市 city = '北京' # 文件路径 path = 'C:\\pathresults\\' # 调用函数,分别输出起点、终点的经纬度 start_point = file_read(path + 'start.txt') end_point = file_read(path + 'end.txt') # print(end_point) # 创建结果txt文件,并填写标签 f_results = open(path + 'result.txt', 'w') f_results.seek(0) f_results.write('路径编号,起点编号,终点编号,节点经度,节点纬度,时间戳\n') # 设置爬取开始时间 start_time = time.time() # 起点编号记录 pathID = 0 # 获取所有起点、终点的参数 p = get_params(start_point, end_point, city, keys) for p, sn, en in p: pathID += 1 r_js = get_url(url, p) data1 = get_datal(r_js) path_num = data1['num'] point_time = start_time for m in range(path_num): points = get_data2(r_js, m) point_num = len(points) # 计算出以i为起点,j为终点的路径中,每个节点之间的平均时间 for point in points: time_per = point['duration'] / point_num point_time = point_time + time_per # 算出每个节点的时间点 point_time2 = time.strftime('%Y-%m-%d %H:%M:%s', time.localtime(point_time)) # 写入数据 f_results.writelines([ str(pathID), ',', str(sn), ',', str(en), ',', str(point['lng']), ',', str(point['lat']), ',', point_time2, '\n' ]) f_results.close() if __name__ == '__main__': main() print('finished')