1.創建百度API應用
類似爬蟲程序,在百度地圖API進行注冊
在此處點擊控制台,在應用管理------我的應用處 創建自己的應用。
創建應用如圖所示,在請求校驗方式處選擇sn校驗方式
記住自己的AK值
點開設置,記住自己的SK值
2.實現
1、sn碼及url的生成
url= http://api.map.baidu.com/geocoder/v2/?address=“輸入的地點名”&output=json&ak='你的AK碼'&sn='你的sn碼'。
需要注意的是:
- 由於url中有中文字符串,需要使用函數
urllib.parse.quote(inputstr, safe="/:=&?#+!$,;'@()*[]")
轉換一下編碼。 - 在url里output可以選擇輸出為json格式或xml格式,默認是xml格式。
2、sn碼的計算方式:
代碼如下:
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @File : BaiduAPI.py 4 # @Author: 趙路倉 5 # @Date : 2020/3/10 6 # @Desc : 7 # @Contact : 398333404@qq.com 8 9 import urllib.request, urllib.parse, urllib.error 10 import json 11 import hashlib 12 13 14 MyAK = '你的AK' 15 MySK = '你的SK' 16 lat = 0 17 lng = 0 18 dictjson = {} # 聲明一個字典 19 20 def JingWei(address): 21 global lat, lng 22 # 產生sn碼 23 queryStr = "/geocoding/v3/?address=" + address + '&output=json&ak=' + MyAK 24 encodedStr = urllib.parse.quote(queryStr, safe="/:=&?#+!$,;'@()*[]") 25 rawStr = encodedStr + MySK 26 sn = (hashlib.md5(urllib.parse.quote_plus(rawStr).encode("utf8")).hexdigest()) 27 28 # 生成url 29 url = urllib.parse.quote("http://api.map.baidu.com" + queryStr + "&sn=" + sn, safe="/:=&?#+!$,;'@()*[]") 30 print('Retrieving', url) 31 32 # 從API讀取數據 33 uh = urllib.request.urlopen(url) 34 data = uh.read().decode() 35 print('Retrieved', len(data), 'characters') 36 37 # 解析數據 38 try: 39 js = json.loads(data) 40 except: 41 js = None 42 43 if not js or 'status' not in js or js['status'] != 0: 44 print('======Failure====') 45 print(data) 46 47 print(json.dumps(js, indent=4, ensure_ascii=False)) 48 49 # 獲取經緯度坐標和地址類型 50 lat = js["result"]["location"]["lat"] 51 lng = js["result"]["location"]["lng"] 52 print('緯度', lat, '經度', lng) 53 level = js["result"]["level"] 54 print('地址類型', level) 55 56 57 # 基於百度地圖API下的經緯度信息來解析地理位置信息 58 def getlocation(lat, lng): 59 print(lat,"ss",lng) 60 url = '/reverse_geocoding/v3/?ak='+MyAK+'&output=json&coordtype=wgs84ll&location='+str(lat)+','+str(lng) 61 encodedStr = urllib.parse.quote(url, safe="/:=&?#+!$,;'@()*[]") 62 rawStr = encodedStr + MySK 63 sn = (hashlib.md5(urllib.parse.quote_plus(rawStr).encode("utf8")).hexdigest()) 64 # 生成url 65 url = urllib.parse.quote("http://api.map.baidu.com" + url + "&sn=" + sn, safe="/:=&?#+!$,;'@()*[]") 66 print('Retrieving', url) 67 req = urllib.request.urlopen(url) # json格式的返回數據 68 res = req.read().decode("utf-8") # 將其他編碼的字符串解碼成unicode 69 print(json.loads(res)) 70 return json.loads(res) 71 72 73 def jsonFormat(lat, lng): 74 str = getlocation(lat, lng) 75 global dictjson 76 dictjson={} 77 # get()獲取json里面的數據 78 jsonResult = str.get('result') 79 address = jsonResult.get('addressComponent') 80 # 國家 81 country = address.get('country') 82 # 國家編號(0:中國) 83 country_code = address.get('country_code') 84 # 省 85 province = address.get('province') 86 # 城市 87 city = address.get('city') 88 # 城市等級 89 city_level = address.get('city_level') 90 # 縣級 91 district = address.get('district') 92 # 區划代碼 93 adcode=address.get('adcode') 94 # 街道 95 street=address.get('street') 96 # 街道編號 97 street_number=address.get('street_number') 98 # 把獲取到的值,添加到字典里(添加) 99 # dictjson['country']=country 100 # dictjson['country_code'] = country_code 101 dictjson['province'] = province+city+district+street+street_number 102 dictjson['adcode'] = adcode 103 # dictjson['city_level'] = city_level 104 # dictjson['district']=district 105 return dictjson 106 107 108 109 if __name__ == "__main__": 110 JingWei("浙江大學") 111 print(jsonFormat(lat,lng)) 112 print(dictjson.get('province')+" 行政區划代碼"+dictjson.get('adcode')) 113 JingWei("深圳大學") 114 print(jsonFormat(lat, lng)) 115 print(dictjson.get('province')+" 行政區划代碼"+dictjson.get('adcode'))
在 jsonFormat(lat, lng) 函數部分可以根據自己的需要進行添加字典。
1 address = jsonResult.get('addressComponent') 2 # 國家 3 country = address.get('country') 4 # 國家編號(0:中國) 5 country_code = address.get('country_code') 6 # 省 7 province = address.get('province') 8 # 城市 9 city = address.get('city') 10 # 城市等級 11 city_level = address.get('city_level') 12 # 縣級 13 district = address.get('district') 14 # 區划代碼 15 adcode=address.get('adcode') 16 # 街道 17 street=address.get('street') 18 # 街道編號 19 street_number=address.get('street_number') 20 # 把獲取到的值,添加到字典里(添加) 21 # dictjson['country']=country 22 # dictjson['country_code'] = country_code 23 dictjson['province'] = province+city+district+street+street_number 24 dictjson['adcode'] = adcode 25 # dictjson['city_level'] = city_level 26 # dictjson['district']=district
輸出的結果: