百度API使用前需要申请AK 申请地址:http://lbsyun.baidu.com/apiconsole/key
在这里,http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-placeapi 主要使用地名检索API接口
使用Python 通过地点名 构建请求网址 返回json格式的地点信息
请求网址:http://api.map.baidu.com/place/v2/search?query=ATM机&tag=银行®ion=北京&output=json&ak=您的ak //GET请求
返回格式
{
"status":0,
"message":"ok",
"results":[
{
"name":"天安门",
"location":{
"lat":39.915526,
"lng":116.403847
},
"address":"北京市东城区长安街",
"province":"北京市",
"city":"北京市",
"area":"东城区",
"street_id":"65e1ee886c885190f60e77ff",
"detail":1,
"uid":"65e1ee886c885190f60e77ff"
},
{
"name":"天安门广场",
"location":{
"lat":39.909652,
"lng":116.404177
},
"address":"北京市东城区东长安街",
"province":"北京市",
"city":"北京市",
"area":"东城区",
"street_id":"c9b5fb91d49345bc5d0d0262",
"detail":1,
"uid":"c9b5fb91d49345bc5d0d0262"
},
{
"name":"天安门广场-国旗",
"location":{
"lat":39.91328,
"lng":116.40393
},
"address":"北京市东城区景山前街4号天安门广场内",
"province":"北京市",
"city":"北京市",
"area":"东城区",
"street_id":"4ae2adcf574bcd2b38221c66",
"detail":1,
"uid":"4ae2adcf574bcd2b38221c66"
},
{
"name":"天安门-华表",
"location":{
"lat":39.91433,
"lng":116.404413
},
"address":"北京市东城区东长安街天安门内",
"province":"北京市",
"city":"北京市",
"area":"东城区",
"street_id":"3ff8be14bf465f3682288ac1",
"detail":1,
"uid":"3ff8be14bf465f3682288ac1"
},
{
"name":"天安门东",
一般json的第一个就是地名的地址,这里的坐标是百度坐标系,如使用其他坐标系需要进行转换。
实例:
def get_coor(地名):
url = "http://api.map.baidu.com/place/v2/search?query="
myak = "®ion=北京&output=json&ak=gPItzAVKUHLXAGcVgIzGMOz8PsZKzGdY" #ak=9VxOsOtmgPLqx6G9yEHGgYLytoARXeub
all_url = url+地名+myak
#print(all_url)
# 这里设置请求最大次数,如果失败,再次发起请求
timeout = 500
socket.setdefaulttimeout(timeout) # 设置超时
requests.adapters.DEFAULT_RETRIES = 5
i = 5
while i>0:
try:
req = requests.get(all_url)
content = json.loads(req.text)
if content["status"] != 0:
print(content["status"])
print(address)
return 0
coor_bd = content["results"][0]["location"]
return [coor_bd["lng"], coor_bd["lat"]]
except:
i = i-1
print(address,'抓取失败-------------------------------')
return 0
最终返回地点的坐标
此外,也可是使用geopy第三方包进行地名坐标抓取,geopy还可以使用高德地图API,使用百度API返回的坐标和上面稍有不一样。