在网络编程中,咱们会和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
urllib.parse.quote(inputstr, safe="/:=&?#+!$,;'@()*[]")
转换一下编码。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