【前言】最近帮忙处理了一个需求,需要计算某城市的养老院的可达性,但是首先需要获取所有养老院的位置经纬度,这个可以通过调用百度地图api的**【行政区划区域检索】**服务来实现。
具体思路是:
1、构建请求的url
检索城市region、关键字query(如养老院、学校、医院等)、检索分类tag(很有用,提高搜索准确性)、每页数量page_size、返回页数page_num等,具体看API详细文档
https://lbsyun.baidu.com/faq/api?title=webapi/guide/webservice-placeapi/district
我这里的示例:
url='https://api.map.baidu.com/place/v2/search?query=养老&tag=行政单位®ion=XX城市&page_size=20&page_num='+str(numpage)+'&output=json&ak='
2、发送请求
3、获取请求结果
4、解析结果入表
详细代码附上
import requests
import json
import time
starttime=time.asctime(time.localtime(time.time()))
starttime1=time.time();
def getjson(numpage):
# 先纬度后经度
url='https://api.map.baidu.com/place/v2/search?query=养老&tag=行政单位®ion=柳州&page_size=20&page_num='+str(numpage)+'&output=json&ak='
while True:
try:
response=requests.get(url=url,timeout=5)
break
except requests.exceptions.ConnectionError:
print ('ConnectionError -- please wait 3 sec')
time.sleep(3)
except requests.exceptions.ChunkedEncodingError:
print ('ChunkedEncodingError -- please wait 3 sec')
time.sleep(3)
except:
print ('Unknow error')
time.sleep(3)
html=response.text
decodejson=json.loads(html)
return decodejson
file_object2=open(r'C:\Users\49520\Desktop\discal\poiresult.txt','w')
count=0
idn=0
try:
for num in range(0,6):
decodejson=getjson(num)
print(decodejson.get('total'))
if decodejson.get('status')==0:#表示运行成功
result=decodejson.get('results')
print(len(result))
if len(result)>0:
for item in result:
name2=item.get('name')
print(name2)
location=item.get('location')
print(location.get('lng'),idn)
idn=idn+1
file_object2.write(str(idn)+','+str(name2)+','+str(location.get('lat')) +','+str(location.get('lng'))+'\n')
else:
print (str(coor)+','+ str(decodejson.get('status'))+decodejson.get('message'))
finally:
file_object2.close()
print ('finish')
限制条件:
普通用户一次检索只能返回10页的结果,比如每页10个,10页就是10*10=100个结果,如果搜索的内容过多数据会请求不全,建议每次查询缩小范围,控制查询的结果,可以切割区域查询。
如有需求,可私信联系!