Python玩转高德地图API(二)

咪哥杂谈

共 3595字,需浏览 8分钟

 ·

2019-09-23 23:21

咪哥杂谈

ea327c3dade2e6315fdd610efbb97ec9.webp

阅读时间约 4 分钟。阅读可忽略代码,代码提供给想练手的人。


1

前言


上篇文章中,简单的介绍了下高德地图的 API 相关业务知识,不知道大家有没有看懂咧!
这篇文章来继续完成上篇文章没有完成的编码任务!忘记的,可以简单回顾一下《Python玩转高德地图API(一)


2

环境介绍


开始前,先来说下本机环境。
  • Python版本  :  Python3.7
  • 开发工具      :   Pycharm
  • 第三方库      :   requests

还会用到的是 Python 自带的 json 库。因为调用 API 返回的结果是 JSON 或者 XML 形式的报文,关于这两点,可以回看《python小课堂25 - 你真的了解JSON嘛?

本项目必然是采用 JSON 啦,现在除了一些传统公司(比如我之前在的保险公司,以及一些国企航空公司)的老项目使用 XML 报文来进行数据传输,大部分互联网项目中采用的都是 JSON 传递接口信息。


3

requests 玩转 API


requests 是一个优雅的男孩子,不对,是一个优雅的第三方库~
555a70ddca3d307cb8836a2f1f0d3bde.webp
在之前的爬虫文章中,有介绍的此库的使用。作者个爱玩摄影的大神,写代码就像玩摄影一样,纯属艺术创作。
以上次介绍高德 API 中的 POI 接口来举例。

1. 打开官网,搜索 POI 处
6f50b4938ce46b36c9f6f5640426d596.webp
2. 阅读官网 API 文档,查看各参数含义
9c99e369a0f93476cae76ceaac09dc02.webp


3. 运行看结果
e447cf877cbb7001f4ac81c30687bd86.webp


看懂文档,理解了官方示例后,其实操作起来很简单,只需要我们用 requests 库携带自己的 key 向高德发起请求即可。

当我们想获取北京市"麦当劳"全部餐饮地址时,请求的地址:

https://restapi.amap.com/v3/place/text?keywords=麦当劳&city=北京&offset=20&page=1&key={key}&extensions=base
url中,?后面跟的就是请求时的参数。

  • keywords :要搜索的关键词
  • city :城市,可以查看具体的城市码表(官方提供)
  • offset :每页显示多少条数据
  • page :页数
  • key :之前申请的用户 key
  • extensions : 传入 base 即可,all 的话比较多余


还有些可选项,不传就行啦,比如 output=xml ,默认不传就是 json 形式返回结果。

4

硬核代码


代码其实不多,算上空行一共 70 行不到,就可以获取完整地理信息。
如果想要实验的同学,可以按照顺序将代码 copy 到自己的编辑器实践。下面按照顺序介绍:
1. 读取用户 key 函数
目的是读取本地 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 方式通用函数
没什么好介绍的,之前说过很多遍了,使用方法按照去看 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. 调用高德 api 抽象方法,解析返回的 json 函数
使用了 python 自带的 json 库,将高德 api 返回的字符串转为了 json 形式,但是在 python 中,其实是 dict 类型的,获取结果可以通过类似 result['address'] 的形式获取想要的内容。
def parse_json(content_json):    """  解析json函数 """    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. 调用高德 api 抽象方法,解析返回的 json 函数


def run():    """ 运行函数 """    keywords = '麦当劳'    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) # 算出一共需要的总页数
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)

最后这个函数,好好说下,精华思路都在这块。
为了代码的灵活度,我们可以将请求的中的变化参数抽出来,作为程序中的变量去构造请求。

请求第一次时,高德地图会返回一个 count 字段,代表总数量,使用 count / offset ,就能得到一共我们要循环访问多少页。代码中做了向上转型的处理。
例如下面:


4c51d73c1181fb6acf5e8b19c5517551.webp
查询北京麦当劳一共 262 个数据,每页只显示 20 条数据(offset的值),所以 262/20 = 13.1 。
这样需要让传入 url 中的 page 从 1 - 14 页去循环获取数据。所以在代码中,使用了 math.ceil 的方法让 13.1 变成 14。
看下最终获取完数据的截图:

88731b5063eb10d3e129dfe58a1430c6.webp
Pycharm后面还有很多很多数据。。

5

总结


嗯!到这里,交通数据分析项目相关的内容就结束了,接下来就是自己开发了...大家感兴趣的也可以自行尝试。
是不是感觉调用 API 这种东西,就是这么简单枯燥而无趣呢。。。可往往各种商业公司的背后,赚钱的逻辑就是靠这些接口丫!

13bd4e2744aff41583112d9f8c5c1fa2.webp


大概一年前的时候,我自己简单的开发出来了第一个版本,当时没有想着用 flask 等框架,后续我会在此项目技术上,继续集成开发吧。
当时放弃的原因是.....上家公司的路段高德地图不支持....
到现在,此项目 star14,fork5。。。

fc3c65e13d3c2e3f75d510f505774029.webp


感兴趣的后台回复 高德 获取源码地址。
说下后期本号的安排,系统性的,表面知识介绍的也差不多了,可能偶尔会随性的写些自己的感想,亦或是 Python 小爬虫方面的东西。
不过接下来的核心路线,是使用 Python 来完成一些数据结构以及算法的知识。比如数组、链表、树,亦或是各种排序算法、有用的算法之类的。。。
毕竟程序员的灵魂核心,还是这些本质上的东西!一味地追新是很累的...Python实现算法的话,语法上有着天然优势,简洁优雅,而不失内涵!

本篇文章就到这里啦,有什么想要说的,欢迎留言区留言探讨!a35808bd2088fc87fbd492f3722585b6.webpa35808bd2088fc87fbd492f3722585b6.webp


▼往期精彩回顾▼Python玩转高德地图API(一)
Python入门自学的一些技巧和心得咪哥的思维认知日记(三) - 赚钱思维



d0259420cf765270b79a9b8d5abee687.webp你点的每个在看,我都认真当成了喜欢
浏览 45
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报