Python玩轉(zhuǎn)高德地圖API(二)
咪哥雜談
閱讀時間約 4 分鐘。閱讀可忽略代碼,代碼提供給想練手的人。
1
前言這篇文章來繼續(xù)完成上篇文章沒有完成的編碼任務(wù)!忘記的,可以簡單回顧一下《Python玩轉(zhuǎn)高德地圖API(一)》
2
環(huán)境介紹- Python版本? :? Python3.7
- 開發(fā)工具? ? ? :? ?Pycharm
- 第三方庫? ??? : ? requests
還會用到的是 Python 自帶的 json 庫。因為調(diào)用 API 返回的結(jié)果是 JSON 或者 XML 形式的報文,關(guān)于這兩點(diǎn),可以回看《python小課堂25 - 你真的了解JSON嘛?》
本項目必然是采用 JSON 啦,現(xiàn)在除了一些傳統(tǒng)公司(比如我之前在的保險公司,以及一些國企航空公司)的老項目使用 XML 報文來進(jìn)行數(shù)據(jù)傳輸,大部分互聯(lián)網(wǎng)項目中采用的都是 JSON 傳遞接口信息。
3
requests 玩轉(zhuǎn) API
在之前的爬蟲文章中,有介紹的此庫的使用。作者個愛玩攝影的大神,寫代碼就像玩攝影一樣,純屬藝術(shù)創(chuàng)作。
以上次介紹高德 API 中的 POI 接口來舉例。
1.?打開官網(wǎng),搜索 POI?處

2.?閱讀官網(wǎng) API 文檔,查看各參數(shù)含義


看懂文檔,理解了官方示例后,其實操作起來很簡單,只需要我們用 requests 庫攜帶自己的 key 向高德發(fā)起請求即可。
當(dāng)我們想獲取北京市"麥當(dāng)勞"全部餐飲地址時,請求的地址:
https://restapi.amap.com/v3/place/text?keywords=麥當(dāng)勞&city=北京&offset=20&page=1&key={key}&extensions=baseurl中,?后面跟的就是請求時的參數(shù)。
- keywords :要搜索的關(guān)鍵詞
- city :城市,可以查看具體的城市碼表(官方提供)
- offset :每頁顯示多少條數(shù)據(jù)
- page :頁數(shù)
- key :之前申請的用戶 key
- extensions :?傳入 base 即可,all 的話比較多余
4
硬核代碼如果想要實驗的同學(xué),可以按照順序?qū)⒋a copy 到自己的編輯器實踐。下面按照順序介紹:
1. 讀取用戶 key 函數(shù)
目的是讀取本地 key ,靈活化處理(這樣不用暴露自己的 key 給大家看了?
) user-key中寫入你自己的key。
def read_key():""" 持久化key,便于讀取 """key_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'user-key')print(key_path)with open(key_path, 'r', encoding='utf-8') as f:key = f.read()print(key)return key
2. requests?請求,get 方式通用函數(shù)
沒什么好介紹的,之前說過很多遍了,使用方法按照去看 requests 庫的官方文檔即可。
def request_url_get(url):""" 請求url方法get方法 """try:r = requests.get(url=url, timeout=30)if r.status_code == 200:return r.textreturn Noneexcept RequestException:print('請求url返回錯誤異常')return None
3. 調(diào)用高德 api 抽象方法,解析返回的 json 函數(shù)
使用了 python 自帶的 json 庫,將高德 api 返回的字符串轉(zhuǎn)為了 json 形式,但是在 python 中,其實是 dict 類型的,獲取結(jié)果可以通過類似 result['address'] 的形式獲取想要的內(nèi)容。
def parse_json(content_json):""" 解析json函數(shù) """result_json = json.loads(content_json)return result_jsondef request_api(url):""" 請求高德api 解析json """result = request_url_get(url)result_json = parse_json(result)return result_json
4. 調(diào)用高德?api 抽象方法,解析返回的 json 函數(shù)
def run():""" 運(yùn)行函數(shù) """keywords = '麥當(dāng)勞'city = 'beijing'key = read_key()offset = 20index_url = f'https://restapi.amap.com/v3/place/text?keywords={keywords}&city={city}&' \f'offset={offset}&page=1&key={key}&extensions=base'index_result = request_api(index_url)pages = math.ceil(int(index_result['count']) / offset) # 算出一共需要的總頁數(shù)for page in range(1, pages + 1):url = f'https://restapi.amap.com/v3/place/text?keywords={keywords}&city={city}&' \f'offset={offset}&page={page}&key={key}&extensions=base'result = request_api(url)print(result)
最后這個函數(shù),好好說下,精華思路都在這塊。
為了代碼的靈活度,我們可以將請求的中的變化參數(shù)抽出來,作為程序中的變量去構(gòu)造請求。
請求第一次時,高德地圖會返回一個 count 字段,代表總數(shù)量,使用 count / offset ,就能得到一共我們要循環(huán)訪問多少頁。代碼中做了向上轉(zhuǎn)型的處理。
例如下面:

查詢北京麥當(dāng)勞一共 262 個數(shù)據(jù),每頁只顯示 20 條數(shù)據(jù)(offset的值),所以 262/20 = 13.1 。
這樣需要讓傳入 url 中的 page 從 1 - 14 頁去循環(huán)獲取數(shù)據(jù)。所以在代碼中,使用了 math.ceil 的方法讓 13.1 變成 14。
看下最終獲取完數(shù)據(jù)的截圖:

Pycharm后面還有很多很多數(shù)據(jù)。。
5
總結(jié)是不是感覺調(diào)用 API 這種東西,就是這么簡單枯燥而無趣呢。。。可往往各種商業(yè)公司的背后,賺錢的邏輯就是靠這些接口丫!

大概一年前的時候,我自己簡單的開發(fā)出來了第一個版本,當(dāng)時沒有想著用 flask 等框架,后續(xù)我會在此項目技術(shù)上,繼續(xù)集成開發(fā)吧。
當(dāng)時放棄的原因是.....上家公司的路段高德地圖不支持....
到現(xiàn)在,此項目 star14,fork5。。。

感興趣的后臺回復(fù)?高德 獲取源碼地址。
說下后期本號的安排,系統(tǒng)性的,表面知識介紹的也差不多了,可能偶爾會隨性的寫些自己的感想,亦或是 Python 小爬蟲方面的東西。
不過接下來的核心路線,是使用 Python 來完成一些數(shù)據(jù)結(jié)構(gòu)以及算法的知識。比如數(shù)組、鏈表、樹,亦或是各種排序算法、有用的算法之類的。。。
畢竟程序員的靈魂核心,還是這些本質(zhì)上的東西!一味地追新是很累的...Python實現(xiàn)算法的話,語法上有著天然優(yōu)勢,簡潔優(yōu)雅,而不失內(nèi)涵!
本篇文章就到這里啦,有什么想要說的,歡迎留言區(qū)留言探討!


Python入門自學(xué)的一些技巧和心得咪哥的思維認(rèn)知日記(三) - 賺錢思維
你點(diǎn)的每個在看,我都認(rèn)真當(dāng)成了喜歡評論
圖片
表情
