在網絡編程中,咱們會和API打交道。那麼,什麼是API?如何使用API呢?本文分享了一下我對API的理解以及百度地圖API的使用。 API是"Application Programming Interface(應用程序編程接口)"的縮寫。若是那一大堆的術語和定義讓你頭暈,不妨試着這樣理解:網絡服務商(好比百度、微博等)存有大量數據,咱們能夠查詢數據,可是須要按照必定的格式/協議,不然服務商不知道咱們的需求沒法進行處理,咱們拿到數據也看不懂。經過API接口規範,通訊雙方都能明白對方傳送的信息和數據,同時也簡化了操做(只要按照規定的格式輸入,就能夠獲得已知格式的輸出,咱們無需瞭解具體實現的技術細節,是否是很省心呢?)php
下面以百度地圖Web服務API的調用爲例。html
(排版時圖片放到最後了,請您到文末查看圖片。)要使用的是圖中所示「正/逆地理編碼服務」。在使用服務前,須要登陸百度帳號(若是沒有就註冊一個),申請成爲百度開發者,而後建立一個你本身的應用,就能夠收到一個對應的服務密鑰(AK)。在服務配置頁面,有兩種校驗方式,一種是IP白名單方式,一種是sn校驗方式。我參考@廖Sir的博文 python實現百度地圖API獲取某地址的經緯度選擇了sn校驗方式,這樣頁面上會有SK。請將AK和SK兩個序列碼保存好,這就是你我的的驗證信息。下一步使用百度地圖API時要用到。 要編寫的這個python小程序實現的功能是:輸入某個地址,獲得相應的經緯度座標信息。分三步實現。一、生成url(用於提交到API進行查詢)二、與API交互,查詢並返回數據(json格式) 三、利用json解析並輸出。python
下面分別介紹具體實現。 一、sn碼及url的生成 url= http://api.map.baidu.com/geocoder/v2/?address=「輸入的地點名」&output=json&ak='你的AK碼'&sn='你的sn碼'。 須要注意的是:web
urllib.parse.quote(inputstr, safe="/:=&?#+!$,;'@()*[]")
轉換一下編碼。import urllib.request,urllib.parse,urllib.error import json import hashlib MyAK='這裏請填入你的AK' MySK='這裏請填入你的SK' while True: address = input('輸入地點:') if len(address)<1: break #產生sn碼 queryStr="/geocoder/v2/?address="+address+'&output=json&ak='+MyAK encodedStr=urllib.parse.quote(queryStr, safe="/:=&?#+!$,;'@()*[]") rawStr=encodedStr+MySK sn=(hashlib.md5(urllib.parse.quote_plus(rawStr).encode("utf8")).hexdigest()) #生成url url=urllib.parse.quote("http://api.map.baidu.com"+queryStr+"&sn="+sn,safe="/:=&?#+!$,;'@()*[]") print('Retrieving',url)
二、輸入url,利用urllib從API讀取數據編程
#從API讀取數據 uh=urllib.request.urlopen(url) data=uh.read().decode() print('Retrieved',len(data),'characters')
三、利用json對返回數據進行解析。json
#解析數據 try: js=json.loads(data) except: js=None if not js or 'status'not in js or js['status']!=0: print('======Failure====') print(data) continue print(json.dumps(js,indent=4,ensure_ascii=False))
上一段可輸出獲得json格式的數據。下面即爲輸入「百度大廈」後程序輸出的json格式數據。在這裏一開始中文字符"商務大廈"
不能正確顯示,我從@msay的博文python中文編碼&json中文輸出問題中找到了答案,json.dumps
函數默認轉換爲ASCII編碼,中文字符就沒法轉換顯示,所以要設置ensure_ascii=False。小程序
{ "status": 0, "result": { "location": { "lng": 116.30695597357376, "lat": 40.05738753357608 }, "precise": 1, "confidence": 80, "comprehension": 100, "level": "商務大廈" } }
最後,提取經緯度座標等信息。api
#獲取經緯度座標和地址類型 lat=js["result"]["location"]["lat"] lng=js["result"]["location"]["lng"] print('緯度',lat,'經度',lng) level=js["result"]["level"] print('地址類型',level)
總結:按照規範發送url以及對返回json或xml格式數據正確解析,另外注意中文字符的編碼問題,就能夠上手API。怎麼樣?你也快來試試吧!網絡
感謝@廖Sir和@msay兩位博主,他們的博文讓我受益良多。ide