python編程之API入門: (一)使用百度地圖API查地理座標

在網絡編程中,咱們會和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

  • 因爲url中有中文字符串,須要使用函數urllib.parse.quote(inputstr, safe="/:=&?#+!$,;'@()*[]")轉換一下編碼。
  • 在url裏output能夠選擇輸出爲json格式或xml格式,默認是xml格式。
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

相關文章
相關標籤/搜索