我要在若干个房子里面找一个通勤最近的,不想一遍一遍地去查高德地图然后来比较,怎么办?我自己写个脚本,批量去request一下高德地图,然后简单整理输出结果,就更一目了然啦~
官方文档
1. 申请个人开发者权限
这一篇写得不错 不赘述
申请高德地图API【流程记录】_高德地图申请api_修炼室的博客-CSDN博客
2. 利用api, 制作header, 请求数据
比如我在上海,想要在早上,以“公交地铁”的方式查询路线
路径规划-API文档-开发指南-Web服务 API | 高德地图API
import urllib.request
import urllib.parse
import json
KEY = "#######"
#公交地铁的header
TRANSIT_HEADER = "https://restapi.amap.com/v3/direction/transit/integrated?"
#地点header, 之后用来查询地点坐标
LOCATION_HEADER = "https://restapi.amap.com/v3/geocode/geo?"
base_dict = {
'key': KEY,
'city': "上海",
'time': '08:40', #白天出发
'extensions': 'base',
'output': 'JSON'
}
transit_base_dict = base_dict.copy()
def make_params(params_dict, key=KEY):
"""
:param key: user key
:param params_dict: dict of param kv
:return: formatted, combine with K=V&
"""
result = ''
for k, v in params_dict.items():
result += f"{k}={v}&"
result += f"key={key}"
return result
3. 解析返回数据
def get_location(query, city = '上海'):
url_loc = LOCATION_HEADER + urllib.parse.urlencode({'address': query, 'city': city, 'key': KEY})
with urllib.request.urlopen(url_loc) as f:
r = f.read().decode('utf-8')
json_obj = json.loads(r)
try:
return json_obj['geocodes'][0]['location']
except:
return None
def get_transit_durs(location_dict):
url_loc = TRANSIT_HEADER + urllib.parse.urlencode(location_dict)
with urllib.request.urlopen(url_loc) as f:
r = f.read().decode('utf-8')
json_obj = json.loads(r)
# print(json_obj)
# print(json_obj['route']['transits'])
try:
transits_durations = [int(x['duration']) / 60 for x in json_obj['route']['transits']]
return transits_durations
except:
return []
def min_transit_durs(location_dict):
durations = get_transit_durs(location_dict)
return min(durations)
def transit_time_query(start_query, end_query):
start_loc = get_location(start_query)
end_loc = get_location(end_query)
transit_base_dict['destination'] = end_loc
location_trans_dict = transit_base_dict.copy()
location_trans_dict['origin'] = start_loc
return min_transit_durs(location_trans_dict)
实例:从人民广场到上海站 还是上海虹桥站 更近?
def sh_to_station():
for start in ['人民广场']:
for end in ['上海站','上海虹桥站']:
dur = transit_time_query(start, end)
print(f"{start} to {end}: {format(dur,'.0f')} mins")
结论:上海站更近。
相应地,可以利用在找房、找办公室、找宾馆等。批量抓取,一目了然。再写写简单的easy coding problem,找找最短的时间等。