1. Python玩轉(zhuǎn)高德地圖API(二)

        共 3595字,需瀏覽 8分鐘

         ·

        2019-09-23 23:21

        咪哥雜談

        ea327c3dade2e6315fdd610efbb97ec9.webp

        閱讀時間約 4 分鐘。閱讀可忽略代碼,代碼提供給想練手的人。


        1

        前言


        上篇文章中,簡單的介紹了下高德地圖的 API 相關(guān)業(yè)務(wù)知識,不知道大家有沒有看懂咧!
        這篇文章來繼續(xù)完成上篇文章沒有完成的編碼任務(wù)!忘記的,可以簡單回顧一下《Python玩轉(zhuǎn)高德地圖API(一)


        2

        環(huán)境介紹


        開始前,先來說下本機環(huán)境。
        • Python版本? :? Python3.7
        • 開發(fā)工具? ? ? :? ?Pycharm
        • 第三方庫? ??? : ? requests

        還會用到的是 Python 自帶的 json 庫。因為調(diào)用 API 返回的結(jié)果是 JSON 或者 XML 形式的報文,關(guān)于這兩點,可以回看《python小課堂25 - 你真的了解JSON嘛?

        本項目必然是采用 JSON 啦,現(xiàn)在除了一些傳統(tǒng)公司(比如我之前在的保險公司,以及一些國企航空公司)的老項目使用 XML 報文來進行數(shù)據(jù)傳輸,大部分互聯(lián)網(wǎng)項目中采用的都是 JSON 傳遞接口信息。


        3

        requests 玩轉(zhuǎn) API


        requests?是一個優(yōu)雅的男孩子,不對,是一個優(yōu)雅的第三方庫~
        555a70ddca3d307cb8836a2f1f0d3bde.webp
        在之前的爬蟲文章中,有介紹的此庫的使用。作者個愛玩攝影的大神,寫代碼就像玩攝影一樣,純屬藝術(shù)創(chuàng)作。
        以上次介紹高德 API 中的 POI 接口來舉例。

        1.?打開官網(wǎng),搜索 POI?處
        6f50b4938ce46b36c9f6f5640426d596.webp
        2.?閱讀官網(wǎng) API 文檔,查看各參數(shù)含義
        9c99e369a0f93476cae76ceaac09dc02.webp


        3. 運行看結(jié)果
        e447cf877cbb7001f4ac81c30687bd86.webp


        看懂文檔,理解了官方示例后,其實操作起來很簡單,只需要我們用 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=base
        url中,?后面跟的就是請求時的參數(shù)。

        • keywords :要搜索的關(guān)鍵詞
        • city :城市,可以查看具體的城市碼表(官方提供)
        • offset :每頁顯示多少條數(shù)據(jù)
        • page :頁數(shù)
        • key :之前申請的用戶 key
        • extensions :?傳入 base 即可,all 的話比較多余


        還有些可選項,不傳就行啦,比如 output=xml ,默認(rèn)不傳就是 json 形式返回結(jié)果。

        4

        硬核代碼


        代碼其實不多,算上空行一共 70 行不到,就可以獲取完整地理信息。
        如果想要實驗的同學(xué),可以按照順序?qū)⒋a copy 到自己的編輯器實踐。下面按照順序介紹:
        1. 讀取用戶 key 函數(shù)
        目的是讀取本地 key ,靈活化處理(這樣不用暴露自己的 key 給大家看了?3168c47f83fe139ab94e2e903217b662.webp) user-key中寫入你自己的key。
        8ae1bfad6aa8f061541b672718930d84.webp
        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.text        return None    except 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_json
        def 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():    """ 運行函數(shù) """    keywords = '麥當(dāng)勞'    city = 'beijing'    key = read_key()    offset = 20
        index_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)型的處理。
        例如下面:


        4c51d73c1181fb6acf5e8b19c5517551.webp
        查詢北京麥當(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ù)的截圖:

        88731b5063eb10d3e129dfe58a1430c6.webp
        Pycharm后面還有很多很多數(shù)據(jù)。。

        5

        總結(jié)


        嗯!到這里,交通數(shù)據(jù)分析項目相關(guān)的內(nèi)容就結(jié)束了,接下來就是自己開發(fā)了...大家感興趣的也可以自行嘗試。
        是不是感覺調(diào)用 API 這種東西,就是這么簡單枯燥而無趣呢。。??赏鞣N商業(yè)公司的背后,賺錢的邏輯就是靠這些接口丫!

        13bd4e2744aff41583112d9f8c5c1fa2.webp


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

        fc3c65e13d3c2e3f75d510f505774029.webp


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

        本篇文章就到這里啦,有什么想要說的,歡迎留言區(qū)留言探討!a35808bd2088fc87fbd492f3722585b6.webpa35808bd2088fc87fbd492f3722585b6.webp


        ▼往期精彩回顧▼Python玩轉(zhuǎn)高德地圖API(一)
        Python入門自學(xué)的一些技巧和心得咪哥的思維認(rèn)知日記(三) - 賺錢思維



        d0259420cf765270b79a9b8d5abee687.webp你點的每個在看,我都認(rèn)真當(dāng)成了喜歡
        瀏覽 74
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
          
          

            1. 欧美麻豆久久久久久中文 | 大雞巴弄得我好舒服黃片动漫版 | 高清无码在线观看视频 | 天天看高清无码视频 | 午夜精品18 视频国产 |