提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、excel调取API方法
- 1.申请一个key
- 2.excel调用API
- 二、python方法
- 计算地址列表中两两之间的OD距离和行车路线
- 总结
前言
爬取高德或百度的数据有数量限制,以高德为例,单日调取经纬度的免费额度为5000条,多个key同时调取也不能改变单日可调用总数。
当数量少的时候可以直接用excel进行操作,方便快捷,但excel在大量处理时会出现错误,数据量上千就推荐使用python,更加方便。
在开始爬取之前,将地址处理成标准格式,即“xx省xx市xx县/区xx小区/村x门x户”,不同的地区会有同名地址存在,所以省市一定要写清楚。
ps:其他地图都类似,本文只以高德为例。
一、excel调取API方法
1.申请一个key
当然申请很多个也可以,看你心情。
在高德开放平台首页登录,然后点击右上方【控制台】,左侧【应用管理】-【我的应用】,然后右上角【创建新应用】,随便创建一个,会出现【添加】字样,点击添加一个key,名字随便,服务平台选【web服务】。
2.excel调用API
获取经纬度:
=FILTERXML(WEBSERVICE("https://restapi.amap.com/v3/geocode/geo?address="&[@出发地址]&"&output=XML&key=Key值"),"//location")
注意替换key值,【@出发地址】替换为地址在excel中的位置,如A1,对于终点位置的经纬度也是同样的获取方法。
获取行车距离:
=FILTERXML(WEBSERVICE("https://restapi.amap.com/v3/distance?origins="&[@出发经纬度]&"&destination="&[@目的经纬度]&"&output=xml&key=Key值"),"//distance")
二、python方法
计算地址列表中两两之间的OD距离和行车路线
代码如下(示例):
import urllib.request #发送请求
from urllib import parse #URL编码
import json #解析json数据
import jsonpath #提取json数据
import pandas as pd #导入pandas库
from openpyxl import load_workbook #从Excel中读取地址
addList = [] #创建一个列表存放地址数据
exbook = load_workbook('C:/Users/……/places.xlsx') #打开存放地址的工作表
addSheet = exbook["sheet1"] #读取工作簿,如果改了工作簿名字那么这里也要改
#按行读取第一列,并存入addList列表:
for row in range(1,addSheet.max_row+1):
addList.append(str(addSheet["A%d"%(row)].value))
dict = {} #创建一个字典用于存放地址经纬度数据
for i in addList:
url1='https://restapi.amap.com/v3/geocode/geo?address='+i+'&output=json&key=key值'
#将一些符号进行URL编码,将这里的“key值”替换成你自己申请的
newUrl1 = parse.quote(url1, safe="/:=&?#+!$,;'@()*[]")
#发送请求
response1 = urllib.request.urlopen(newUrl1)
#读取数据
data1 = response1.read()
#解析json数据
jsonData1 = json.loads(data1)
#geocodes→0→location得到经纬度,写入字典
dict[i] = jsonData1['geocodes'][0]['location']
dict_route={"出发地":[],"目的地":[],"距离":[],"线路":[]}
k = len(addList) #nameList列表中元素个数
#遍历addList列表
for m in range(k):
for n in range(k):
#从addList中得到地址的名称,获得dict中的经纬度
origin = dict[addList[m]]
destination = dict[addList[n]]
url2='https://restapi.amap.com/v3/direction/driving?origin='+origin+'&destination='+destination+'&extensions=all&output=json&strategy=6&&key=key值'
#编码,这里也要替换key
newUrl2 = parse.quote(url2, safe="/:=&?#+!$,;'@()*[]")
#发送请求
response2 = urllib.request.urlopen(newUrl2)
#接收数据
data2 = response2.read()
#解析json文件
jsonData2 = json.loads(data2)
#输出该json中所有road的值
road=jsonpath.jsonpath(jsonData2,'$..road')
#从json文件中提取距离
distance = jsonData2['route']['paths'][0]['distance']
#字典dict_route中追加数据
dict_route.setdefault("出发地",[]).append(addList[m])
dict_route.setdefault("目的地",[]).append(addList[n])
dict_route.setdefault("距离",[]).append(distance)
dict_route.setdefault("线路",[]).append(road)
route=pd.DataFrame(dict_route)#将字典数据创建DataFrame
route.to_excel("C:/Users/……/route_list.xlsx",sheet_name="route") #导出
想要经纬度的话,就在输出表中把origin和destination两个变量一起输出。
总结
官方文档里提供了很多参考代码,可以进行适当替换。百度地图的操作也是类似的,只不过我习惯于用高德了。
每天爬取到单日数据量上限的时候会收到超额提示短信和邮件,不用理会。
更多内容可见高德开发平台官方指南。
高德API示例,可以直观看到API中提供了哪些接口。
高德自定义地图,可在线对空间数据进行可视化,务必注意经纬度数据的格式和样例保持一致。
文章出处登录后可见!
已经登录?立即刷新