【已解决】调用百度地图API将城市转换为经纬度问题

先获取城市名,如:安徽合肥、上海...,再通过调取百度地图的API来获取相应的经纬度。


url 正确格式应该为:

url = 'http://api.map.baidu.com/geocoder/v2/?address=%s&output=json&ak=你的密钥匙(AK)' % (name)


注意 3 点:

1、在百度地图开放端申请 ak 时,准备用浏览器访问,应用类型就选用 “ 浏览器端 ” ,“启用服务”这一项默认情况下没有全选,所以,打开 url 时若报错,如:{ status  240 message "APP 服务器被禁用" },那你一定要去看看这一项,检查相关的服务有没有打开。


2、url 格式一定要对。

格式不对,会报错:

 INVALID_PARAMETERS 非法参数,参数错误时候给出。
 最后,打开 url 后,输出的形式为:
{"status":0,"result":{"location":{"lng":117.28269909168304,"lat":31.86694226068694},"precise":0,"confidence":12,"level":"城市"}}


3、对于url 中文混搭

如果 name是中文,那么在用urllib.request请求时会报错:

# url 含中文时
url = 'http://api.map.baidu.com/geocoder/v2/?address=安徽合肥市s&output=json&ak=uYr0vs7KOcs8I5y6e4Y479CyW6xOC3GV'
req = urllib.request.Request(url)
print(req)
html = urllib.request.urlopen(req)  # 获取页面
jsons = html.read().decode('utf-8') #转化为str类型

#会报错:
UnicodeEncodeError: 'ascii' codec can't encode characters

解决:对中文部分进行编码  parse.quote()

####  处理混合中文的 url,先用 parse.quote()
from urllib import parse
s='安徽合肥市'
h = parse.quote(s)
url = 'http://api.map.baidu.com/geocoder/v2/?address=%s&output=json&ak=uYr0vs7KOcs8I5y6e4Y479CyW6xOC3GV' % (h)
req = urllib.request.urlopen(url)
# print(req)
html=req.read().decode('UTF-8')  #转为 str
# html=req.read()   #
# print(type(html))
## 输出为:{"status":0,"result":{"location":{"lng":117.28269909168304,"lat":31.86694226068694},"precise":0,"confidence":12,"level":"城市"}}
hjson = json.loads(html)  # 转化为dict类型

lng_lat = ['', '']
if hjson['result']:
    lng = hjson['result']['location']['lng']  # 经度
    print(type(lng))  #
    # print(lng)
    lat = hjson['result']['location']['lat']  # 纬度
    lng_lat = [lng, lat]
    print(lng_lat)   #  如 :[117.28269909168304, 31.86694226068694]
else:
   print('error')


另:论坛里会有百度地图的相关技术人员发的技术贴,各类错误解释,可以逛逛。

官方介绍


你可能感兴趣的:(爬虫)