高德其实为开发者提供了专属key去获取它们的数据,但每天有限额,所以比较适合想要获取少量POI数据去进行使用的小伙伴~~
1.获取Key
所以怎么成为开发者并获取key呢?按照以下链接操作即可:(个人也可以
获取Key-创建工程-开发指南-Web服务 API | 高德地图API
高德提供了多种类型的数据,不同的类型也有不同的限额
本文提供的方法是周边查询,也就是在一个POI点指定的半径周围获取指定关键词的其它POI信息
关于其它POI搜索类型,详见搜索POI-API文档-开发指南-Web服务 API | 高德地图API
2.Python代码获取数据
1.导入模块
import requests
import json
import xlwt
2.自定义方法
# 根据坐标获取poi数据
def getpois(center_name,polygon, keywords, radius):
i = 1
current_polygon_poi_list = []
while True: # 使用while循环不断分页获取数据
result = getpoi_page(polygon, i, keywords, radius)
result = json.loads(result) # 将字符串转换为json
if result['status'] != '1': # 接口返回的状态不是1代表异常
print('======爬取错误,返回数据:' + result)
break
pois = result['pois']
if len(pois) < offset: # 返回的数据不足分页页大小,代表数据爬取完
current_polygon_poi_list.extend(pois)
break
current_polygon_poi_list.extend(pois)
i += 1
print('===========当前polygon:', center_name, polygon, ',爬取到的数据数量:', str(len(current_polygon_poi_list)))
return current_polygon_poi_list
# 单页获取pois
def getpoi_page(polygon, page,keywords, radius):
print(polygon)
req_url = poi_search_url + "?key=" + amap_web_key + '&location=' + polygon + '&keywords=' + keywords + '&offset=' + str(
offset)+ '&page=' + str(page) + '&radius=' + str(radius) + '&sortrule=distance' + '&output=json'
# + '&types=' + type_list
data = ''
with requests.get(req_url) as response:
data = response.text
print(data)
return data
# 数据写入excel
def write_to_excel(poilist, filename):
# 一个Workbook对象,这就相当于创建了一个Excel文件
book = xlwt.Workbook(encoding='utf-8', style_compression=0)
sheet = book.add_sheet('0', cell_overwrite_ok=True)
# 第一行(列标题)
sheet.write(0, 0, 'id')
sheet.write(0, 1, 'name')
sheet.write(0, 2, 'lon')
sheet.write(0, 3, 'lat')
sheet.write(0, 4, 'address')
sheet.write(0, 5, 'pname')
sheet.write(0, 6, 'cityname')
sheet.write(0, 7, 'adname')
sheet.write(0, 8, 'type')
sheet.write(0, 9, 'distance')
sheet.write(0, 10, 'parent')
for i in range(len(poilist)):
sheet.write(i + 1, 0, poilist[i]['id'])
sheet.write(i + 1, 1, poilist[i]['name'])
lon = float(str(poilist[i]['location']).split(",")[0])
lat = float(str(poilist[i]['location']).split(",")[1])
sheet.write(i + 1, 2, lon)
sheet.write(i + 1, 3, lat)
sheet.write(i + 1, 4, poilist[i].get('address'))
sheet.write(i + 1, 5, poilist[i].get('pname'))
sheet.write(i + 1, 6, poilist[i].get('cityname'))
sheet.write(i + 1, 7, poilist[i].get('adname'))
sheet.write(i + 1, 8, poilist[i]['type'])
sheet.write(i + 1, 9, poilist[i]['distance'])
sheet.write(i + 1, 10, poilist[i]['parent'])
book.save(filename)
3.执行主代码
根据自己的需求,修改amap_web_key,filename,polygon_list,keywords,radius即可
if __name__ == '__main__':
amap_web_key = '...' # 改:高德地图官网申请的Web API KEY
url = 'https://restapi.amap.com/v3/place/around?key=' + amap_web_key
filename = r'C:/...' # 改:爬取到的数据写入的EXCEL路径
polygon_list = {...} # 改:名称+经纬度字典,如:{'coco':'123.12,45.45'}
# 查询关键字
keywords = '奶茶' # 改:POI周围寻找的类别
# 查询半径
radius = 1000
poi_search_url = "https://restapi.amap.com/v3/place/around" # URL
offset = 25 # 分页请求数据时的单页大小
print('开始爬取...')
all_poi_list = [] # 爬取到的所有数据
for center_name in polygon_list:
polygon=polygon_list[center_name]
polygon_poi_list = getpois(center_name,polygon, keywords, radius)
all_poi_list.extend(polygon_poi_list)
print('爬取完成,总的数量:', len(all_poi_list))
write_to_excel(all_poi_list, filename)
print('写入成功')
最终的excel文件格式,可以通过修改代码,获取其它的字段信息,返回的参数信息详见搜索POI-API文档-开发指南-Web服务 API | 高德地图API