百度API获取地点经纬度
使用python调用百度地图API获得指定地点的经纬度
参考文章:https://www.cnblogs.com/zealousness/p/8303645.html
使用本文,发现一个问题,作者提供的key可以正常调用API,但是自己的key和同事的key却不行。
百度一把,发现作者的url是旧版本的,现在已升级到V3,因此url位置需要重新拼接。
官方指导文档如下:http://lbs.baidu.com/index.php?title=webapi/guide/webservice-geocoding
更新后代码段如下:
import json
from urllib.request import urlopen,quote
import pandas as pd
import time
#http://api.map.baidu.com/geocoding/v3/?address=北京市海淀区上地十街10号&output=json&ak=您的ak&callback=showLocation
def p2l(name):
# 1、设置url和3个参数(输出格式,key,要翻译的地址)
url = 'http://api.map.baidu.com/geocoding/v3/'
output = 'json'
# ak = 'sXZHPZahdMeK3Gy3uC7ZeRQrVXXXXXXX'
ak = '8fRDBDKqn4BYByCymMXf0OHf7XXXXXXX' #此key打码,请申请自己的key替换掉
address = quote(name)
# 2、拼接get请求(url?参数1=值1&参数2=值2&参数3=值3)
request = url + '?' + 'address=' + address + '&output=' + output + '&ak=' + ak
# 3、urlopen发送请求,获得response
response_file = urlopen(request)
# 4、读取response字符串
response_str = response_file.read().decode()
# 5、str转json
response_json = json.loads(response_str)
# print(response_json)
# 6、读json,
lat=response_json['result']['location']['lat']
lng=response_json['result']['location']['lng']
return [lat,lng]
name = '河北省 石家庄 中山东路 北国商城'
# name = input()
print(p2l(name))
关于百度API
- 使用爬虫时,要注意设定间隔时间,避免给服务器造成太大负荷。可惜没在官方文档上找到最大请求数。问同事说,百度API的逆地理API美秒最多160次。我加入了time.sleep(0.01),设定了间隔,美秒发出的请求不超过100条。
- 注册key的时候,正常的脚本开发选择“浏览器”选项
最后,附上本次的使用心得:
因为是批量查询地点的缘故。本次脚本前期没有写纠错机制。很多时候,查询的链接或多或少会出点问题,比如网络波动引发的超时报错。调用api的语句,一定记得写在try...except语句中。这样,一条查询出问题也可以继续查询后续的数据。
试想,如果没有纠错机制,手中共有8万条数据需要查询,当等待了数十分钟,查询了6万多行时,程序抛出错误,前面的数据也没有及时写入文件,那么除了要补上纠错语句,还得花费大力气去寻找异常位置。对时间和精力都是巨大的消耗。