地图用的高德地图,首先先获取高德API的key。
搜索范围内获取的数据在800条之内较为准确,所以先要判断返回的数据量是否大于800。若大于800条,则对区域进行划分,划分成四个小格,对这四个小格进行搜索,判断小格数据量是否大于800,如此循环。若请求url的次数过多,要读准备几个key,循环取。
1. 先定义获取url的函数
def get_url(x1,y1,x2,y2,types,n,my_key):
url = 'https://restapi.amap.com/v3/place/polygon?polygon='+str(x1)+','+str(y1)+'|'+str(x2)+','+str(y2)+'&types='+str(types)+'&output=json&key='+str(my_key)+'&page='+str(n)
return url
2.获取数据
高德坐标拾取器:https://lbs.amap.com/tools/picker
import requests
import pandas
x1 = 121.483259
y1 = 31.271943
x2 = 121.516389
y2 = 31.299962
types = '140000'
my_key = 'XXXXXXX'
x_list = [x1,x2]
y_list = [y1,y2]
while (len(x_list) != 0) & (len(y_list) != 0):
for n in range(1,100):
# 获取第一对坐标的数据
x1 = x_list[0]
y1 = y_list[0]
x2 = x_list[1]
y2 = y_list[1]
url = get_url(x1,y1,x2,y2,types,n,my_key)
html = requests.get(url)
html.close()
data = html.json()
count = int(data['count'])
page = int(count/20)
if count > 800:
print('数据量大于800,需要进行拆分操作')
# 将坐标进行拆分
# 在坐标池中去掉本对坐标
x0 = (x1+x2)/2
y0 = (y1+y2)/2
x_list.remove(x1)
x_list.remove(x2)
y_list.remove(y1)
y_list.remove(y2)
# 在坐标池中增加新的四个小方格坐标
x_list.append(x1)
x_list.append(x0)
x_list.append(x1)
x_list.append(x0)
x_list.append(x0)
x_list.append(x2)
x_list.append(x0)
x_list.append(x2)
y_list.append(y1)
y_list.append(y0)
y_list.append(y0)
y_list.append(y2)
y_list.append(y0)
y_list.append(y2)
y_list.append(y1)
y_list.append(y0)
break
elif count > 0 & count<=800:
print('数据量小于800,且该页有数据,进行读取并存储')
try: # 当某一页内的数据量不足20条时会报错,用try函数避免报错。
for i in range(20):
# 按条读取数据
info = []
info.append(data['pois'][i]['name'])
info.append(data['pois'][i]['address'])
info.append(data['pois'][i]['type'].split(';')[0])
info.append(data['pois'][i]['type'].split(';')[1])
info.append(data['pois'][i]['type'].split(';')[2])
info.append(data['pois'][i]['location'].split(',')[0])
info.append(data['pois'][i]['location'].split(',')[1])
# 将获取到的一条一条信息保存到csv文件中
info = [info]
info = pandas.DataFrame(info)
info.to_csv(r'文件路径\XXX.csv',header=None,index=None,mode='a',encoding='gbk')
except:
print('该页数据不到20个')
x_list.pop(0)
x_list.pop(0)
y_list.pop(0)
y_list.pop(0)
break
结果: