API,全称为 Application Programming Interface,即应用程序编程接口,是一个可用于检索代码并将数据发送到使用代码的服务器。
当我们想从API接收数据时,我们需要发出请求。请求遍及整个网络。例如,当您访问此博客文章时,您的Web浏览器向服务器发出了请求,该服务器以该Web页的内容作为响应。
先安装好python中的requests库 (Teriminal中直接输入)
pip install requests
requests库中有许多不同类型的请求。最常用的一个GET请求用于检索数据。由于我们将仅检索数据,因此我们的重点将放在发出“get”请求上。
发出“GET”请求,我们使用 requests.get( ) 函数,定义如下:
help(requests.get)
Help on function get in module requests.api:
get(url, params=None, **kwargs)
Sends a GET request.
:param url: URL for the new :class:`Request` object.
:param params: (optional) Dictionary, list of tuples or bytes to send
in the query string for the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
其中首先注意 u r l url url 这个输入参数,就是最重要的API接口。
现在我们接入一个API
response = requests.get("http://api.open-notify.org/this-api-doesnt-exist")
print(response.status_code)
# 404
可能你们会很熟悉“404”这个状态代码,这是服务器返回的一个状态代码,说明要获取的资源并不存在与这个服务器上。
还有很多其他的状态代码:
·200:一切正常,结果已返回(如果有)。
·301:服务器将您重定向到其他端点。当公司切换域名或更改端点名称时,可能会发生这种情况。
·400:服务器认为您提出了错误的请求。当您没有正确发送数据时,可能会发生这种情况。
·401:服务器认为您未通过身份验证。许多API都需要登录证书,因此当您没有发送正确的凭据来访问API时就会发生这种情况。
·403:您尝试访问的资源被禁止:您没有查看该资源的正确权限。
·404:在服务器上找不到您尝试访问的资源。
·503:服务器尚未准备好处理请求。
通常,特定服务器上会提供多个API。这些API中的每一个通常称为端点。我们将使用的第一个端点是http://api.open-notify.org/astros.json,该端点返回有关当前太空中宇航员的数据。
response = requests.get("http://api.open-notify.org/astros.json")
print(response.status_code)
# 200
返回值是“200”,说明一切正常,结果已返回。
但是要注意的是,返回的格式是JSON形式,我们来输出一下看看:
print(response.json())
#{'message': 'success', 'people': [{'name': 'Alexey Ovchinin', 'craft': 'ISS'}, {'name': 'Nick Hague', 'craft': 'ISS'}, {'name': 'Christina Koch', 'craft': 'ISS'}, {'name': 'Alexander Skvortsov', 'craft': 'ISS'}, {'name': 'Luca Parmitano', 'craft': 'ISS'}, {'name': 'Andrew Morgan', 'craft': 'ISS'}], 'number': 6}
输出的格式有利于计算器去阅读,但是我们并不容易去观察到这组数据的特点,这样,我们就需要导入json模块去处理这个JSON数据。
import json
def jprint(obj):
# create a formatted string of the Python JSON object
text = json.dumps(obj, sort_keys=True, indent=4)
print(text)
jprint(response.json())
输出如下:
{
"message": "success",
"number": 6,
"people": [
{
"craft": "ISS",
"name": "Alexey Ovchinin"
},
{
"craft": "ISS",
"name": "Nick Hague"
},
{
"craft": "ISS",
"name": "Christina Koch"
},
{
"craft": "ISS",
"name": "Alexander Skvortsov"
},
{
"craft": "ISS",
"name": "Luca Parmitano"
},
{
"craft": "ISS",
"name": "Andrew Morgan"
}
]
}
这样看起来,就是python中dictionary的形式,很容易去看到数据具有怎样的属性,也便于进一步的数据处理。
在之前的GET函数中,除了输入URL,还有一个属性是params。不是所有请求的状况下都需要params,但请求某些特定的数据是,需要给服务器一个参量,才可以返回你想要的数据。
例如http://api.open-notify.org/iss-pass.json这个端点。该端点下次告诉我们国际空间站将经过地球上的给定位置。这时候我们就要输入地理位置,已获取空间站的位置。
parameters = {
"lat": 40.71,
"lon": -74
}
以字典的形式给出一个经纬度信息,再次使用GET请求数据。
response = requests.get("http://api.open-notify.org/iss-pass.json", params=parameters)
jprint(response.json())
返回的数据:
{
"message": "success",
"request": {
"altitude": 100,
"datetime": 1568062811,
"latitude": 40.71,
"longitude": -74.0,
"passes": 5
},
"response": [
{
"duration": 395,
"risetime": 1568082479
},
{
"duration": 640,
"risetime": 1568088118
},
{
"duration": 614,
"risetime": 1568093944
},
{
"duration": 555,
"risetime": 1568099831
},
{
"duration": 595,
"risetime": 1568105674
}
]
}
但是上述的时间——risetime 是一串数字,貌似很难去理解,这种时间格式叫做timestamp或者是epoch。我们可以使用datetime库来转化为我们熟悉的时间格式。
首先取出时间:
risetimes = []
for d in pass_times:
time = d['risetime']
risetimes.append(time)
print(risetimes)
然后导入datetime库,进行转换:
from datetime import datetime
times = []
for rt in risetimes:
time = datetime.fromtimestamp(rt)
times.append(time)
print(time)
结果一目了然:
2019-09-09 21:27:59
2019-09-09 23:01:58
2019-09-10 00:39:04
2019-09-10 02:17:11
2019-09-10 03:54:34
这篇文章只是一个简单的教程,后面我会发布新的一篇使用python接入图灵机器人API的实战文章,敬请关注。
− − − − − − − − − − − − − − − − ---------------- −−−−−−−−−−−−−−−−
该文章首发于 zyairelu.cn
欢迎来到我的网站进行评论及研讨
个人邮箱[email protected]
− − − − − − − − − − − − − − − − ---------------- −−−−−−−−−−−−−−−−