python3調取百度地圖API輸出某地點的經緯度資訊
阿新 • • 發佈:2018-12-24
1. 檢視API介面說明
地址:http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding
注:callback的功能暫未研究
2. 申請自己的ak(類似於連通百度地圖伺服器的鑰匙,請勿洩露)
注:除錯階段,應用名稱隨意填寫即可
3.1 將下面的url輸入到瀏覽器中(更換成自己的ak),驗證返回引數
頁面顯示
showLocation&&showLocation({"status":0,"result":{"location":{"lng":116.3084202915042,"lat":40.05703033345938},"precise":1,"confidence":80,"comprehension":100,"level":"道路"}})
注意:返回的格式不是json格式(json格式是直接大括號開始的)
介紹一個基於Chrome的小外掛——FeHelper,可以自動美化程式碼,如下圖所示
3.2 使用python驗證
注意:需要將示例重點callback引數去掉,才能返回標準的json格式,否則json.loads()函式會報錯
1 import requests 2 import json 3 import pprint 4 5 url = 'http://api.map.baidu.com/geocoder/v2/?address=北京市海淀區上地十街10號&output=json&ak=piQGckMZTubVw29GiBT1BDwDjwztm***'#隱藏掉了我的ak最後三位 6 res = requests.get(url) 7 8 json_data = json.loads(res.text) 9 pprint.pprint(json_data)#格式化列印,可讀性更佳
結果
注意:使用pprint可以格式化列印結果
3.3 繼續研究
1 #查詢某城市中的具體地點,兩種寫法均可 2 #url = 'http://api.map.baidu.com/geocoder/v2/?address=北京市海淀區上地十街10號&output=json&ak=piQGckMZTubVw29GiBT1BDwDjwztm47s&callback=showLocation'3 #url = 'http://api.map.baidu.com/geocoder/v2/?address=海淀區上地十街10號city=北京市&output=json&ak=piQGckMZTubVw29GiBT1BDwDjwztm47s&callback=showLocation' 4 5 #查詢某個城市 6 #url = 'http://api.map.baidu.com/geocoder/v2/?address=北京市&output=json&ak=piQGckMZTubVw29GiBT1BDwDjwztm47s&callback=showLocationllback=showLocation'
4. 使用者輸入地點,輸出經緯度(此處遇到了一個大坑!)
在使用requests.get(url)方法時,會將提交的url中的中文進行編碼(即便你的python和網頁的編碼都是utf-8),url中的中文會顯示成如下
http://api.map.baidu.com/geocoder/v2/?address=%E5%8C%97%E4%BA%AC%E5%B8%82&output=json&ak=piQGckMZTubVw29GiBT1BDwDjwztm***
需要使用urllib.parse.unquote()解碼,但是解碼完了雖然輸出的url是正確的,但是再次使用requests.get()時又不對
注意一點是:這個方法不能在params中使用(params是字典格式,整體不支援;單獨針對字典裡的中文字串進行這個操作也沒有用,因為在字典裡是正確的。只是在進行requests.get()時進行了url編碼)
解決方案:
不使用reques.get(url,params)形式,使用format
url = 'http://api.map.baidu.com/geocoder/v2/?address={}&output=json&ak=piQGckMZTubVw29GiBT1BDwDjwztm47s'.format(address)
5. 根據需求輸出經度、緯度
全部程式碼
1 # -*- coding:utf-8 -*- 2 '''百度服務文件參考http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding''' 3 import requests 4 import json 5 import pprint 6 import urllib.parse 7 8 #查詢某城市中的具體地點,兩種寫法均可 9 #url = 'http://api.map.baidu.com/geocoder/v2/?address=北京市海淀區上地十街10號&output=json&ak=piQGckMZTubVw29GiBT1BDwDjwztm***' 10 #url = 'http://api.map.baidu.com/geocoder/v2/?address=海淀區上地十街10號city=北京市&output=json&ak=piQGckMZTubVw29GiBT1BDwDjwztm***' 11 #查詢某個城市 12 #url = 'http://api.map.baidu.com/geocoder/v2/?address=北京市&output=json&ak=piQGckMZTubVw29GiBT1BDwDjwztm***' 13 14 address = input('請輸入地址:') 15 ''' 16 par = { 17 'address':address, 18 'output':'json', 19 'ak':'piQGckMZTubVw29GiBT1BDwDjwztm***', 20 } 21 url = 'http://api.map.baidu.com/geocoder/v2/' 22 res = requests.get(url,par) 23 print(res.url)#中文進行了再編碼 24 url1 = urllib.parse.unquote(res.url) 25 print(url1)#進行中文解碼後,輸出正確 26 res1 = requests.get(url1) 27 print(res1.url)#中文進行了再編碼 28 ''' 29 30 url2 = 'http://api.map.baidu.com/geocoder/v2/?address={}&output=json&ak=piQGckMZTubVw29GiBT1BDwDjwztm***'.format(address) 31 print(url2) 32 res2 = requests.get(url2) 33 print(res2) 34 json_data = json.loads(res2.text) 35 pprint.pprint(json_data) 36 longitude = json_data['result']['location']['lng'] 37 latitude = json_data['result']['location']['lat'] 38 print(longitude,latitude)