但是,为什么要使用API而不是可以下载的静态数据集呢?API在以下情况下很有用:
a.数据变化很快。股票价格数据就是一个例子。重新生成数据集并每分钟下载一次并没有实际意义-这会占用大量带宽,而且速度很慢。
b.您需要一小部分更大的数据。Reddit评论就是一个例子。如果您只想在Reddit上发表自己的评论该怎么办?下载整个Reddit数据库,然后仅过滤您自己的注释并没有多大意义。
c.涉及重复计算。Spotify的API可以告诉您音乐的流派。从理论上讲,您可以创建自己的分类器,并使用它对音乐进行分类,但您将永远不会拥有Spotify所拥有的数据。
在上述情况下,API是正确的解决方案。对于本数据科学教程,大家将查询一个简单的API,以检索有关国际空间站(ISS)的数据。使用API可以节省大家自己进行所有计算的时间和精力。
大数据分析Python中的API请求
API托管在Web服务器上。当您www.google.com在浏览器的地址栏中键入内容时,您的计算机实际上是在向www.google.com服务器询问网页,然后该网页返回到您的浏览器。
API的工作方式几乎相同,除了您的程序要求数据而不是您的Web浏览器询问网页之外。这些数据通常以JSON格式返回(有关更多信息,请参阅有关使用JSON数据的教程)。
为了获取数据,大家向Web服务器发出请求。然后,服务器将回复大家的数据。在大数据分析Python中,大家将使用请求库来执行此操作。在此大数据分析PythonAPI教程中,大家将为所有示例使用大数据分析Python3.4。
请求类型
有许多不同类型的请求。最常用的一个GET请求用于检索数据。
大家可以使用一个简单的GET请求从OpenNotifyAPI检索信息。
OpenNotify具有多个API端点。端点是用于从API检索不同数据的服务器路由。例如,/commentsRedditAPI上的端点可能会检索有关注释的信息,而/users端点可能会检索有关用户的数据。要访问它们,您可以将端点添加到API的基本URL中。
大家将在OpenNotify上看到的第一个端点是iss-now.json端点。该端点获取国际空间站的当前纬度和经度。如您所见,检索此数据不适用于数据集,因为它涉及服务器上的一些计算,并且变化很快。
您可以在此处查看OpenNotify上所有端点的列表。
OpenNotifyAPI的基本网址是http://api.open-notify.org,因此大家将其添加到所有端点的开头。
状态码
大家刚刚发出的请求的状态码为200。向Web服务器发出的每个请求都返回状态代码。状态代码指示有关请求发生的情况的信息。以下是与GET请求相关的一些代码:
a)200-一切正常,结果已返回(如果有)
b)301—服务器正在将您重定向到其他端点。当公司切换域名或更改端点名称时,可能会发生这种情况。
c)401-服务器认为您未通过身份验证。当您没有发送正确的凭据来访问API时就会发生这种情况(大家将在以后的文章中讨论身份验证)。
d)400-服务器认为您提出了错误的请求。当您没有正确发送数据时,可能会发生这种情况。
e)403—您尝试访问的资源被禁止—您没有正确的权限查看它。
f)404-在服务器上找不到您尝试访问的资源。
现在http://api.open-notify.org/iss-pass,根据API文档,向不存在的端点发出GET请求。
击中正确的终点
iss-pass不是有效的端点,因此大家得到了一个404状态码作为相应。.json正如API文档所述,大家忘记在最后添加。
现在,大家将向发出GET请求http://api.open-notify.org/iss-pass.json。
查询参数
您将在上一个示例中看到,大家得到了一个400状态码,表示请求错误。如果您查看OpenNotifyAPI的文档,大家会发现ISSPass端点需要两个参数。
当ISS下次通过地球上的给定位置时,将返回ISSPass端点。为了对此进行计算,大家需要将位置的坐标传递给API。为此,大家传递了两个参数-纬度和经度。
为此,大家可以在params请求中添加可选的关键字参数。在这种情况下,大家需要传递两个参数:
1)lat—大家想要的位置的纬度。
2)lon—大家想要的位置的经度。
大家可以使用这些参数制作字典,然后将它们传递给requests.get函数。
大家还可以通过将查询参数添加到url中来直接做同样的事情,如下所示:http://api.open-notify.org/iss-pass.json?lat=40.71&lon=-74。
将参数设置为字典几乎总是可取的,因为requests它可以处理一些事情,例如正确设置查询参数的格式。
大家将使用纽约市的坐标进行请求,然后查看得到的答复。
b'{n”message”:”success”,n”request”:{n”altitude”:100,n”datetime”:1441417753,n”latitude”:40.71,n”longitude”:-74.0,n”passes”:5n},n”response”:[n{n”duration”:330,n”risetime”:1441445639n},n{n”duration”:629,n”risetime”:1441451226n},n{n”duration”:606,n”risetime”:1441457027n},n{n”duration”:542,n”risetime”:1441462894n},n{n”duration”:565,n”risetime”:1441468731n}n]n}’
b'{n”message”:”success”,n”request”:{n”altitude”:100,n”datetime”:1441417753,n”latitude”:40.71,n”longitude”:-74.0,n”passes”:5n},n”response”:[n{n”duration”:329,n”risetime”:1441445639n},n{n”duration”:629,n”risetime”:1441451226n},n{n”duration”:606,n”risetime”:1441457027n},n{n”duration”:542,n”risetime”:1441462894n},n{n”duration”:565,n”risetime”:1441468731n}n]n}’
使用JSON数据
您可能已经注意到,响应的内容之前是astring(尽管它显示为bytes对象,但是大家可以使用轻松地将内容转换为字符串response.content.decode(“utf-8”))。
字符串是大家将信息来回传递给API的方式,但是很难从字符串中获取大家想要的信息。大家如何知道如何解码返回的字符串并在大数据分析Python中使用它?大家如何altitude从字符串响应中找出ISS的含义?
幸运的是,有一种名为JavaScriptObjectNotation(JSON)的格式。JSON是一种将列表和字典之类的数据结构编码为字符串的方法,以确保它们易于被机器读取。JSON是将数据来回传递给API的主要格式,大多数API服务器将以JSON格式发送其响应。
json套件随附大数据分析Python强大的JSON支持。该json软件包是标准库的一部分,因此大家无需安装任何程序即可使用它。大家既可以将列表和字典转换为JSON,也可以将字符串转换为列表和字典。就大家的ISSPass数据而言,它是一个字典,编码为JSON格式的字符串。
json库有两种主要方法:
1)dumps—接收一个大数据分析Python对象,并将其转换为字符串。
2)loads—接收JSON字符串,并将其转换为大数据分析Python对象。
从API请求获取JSON
通过使用.json()响应上的方法,您可以将响应的内容作为大数据分析Python对象获取。
{‘response’:[{‘risetime’:1441456672,’duration’:369},{‘risetime’:1441462284,’duration’:626},{‘risetime’:1441468104,’duration’:581},{‘risetime’:1441474000,’duration’:482},{‘risetime’:1441479853,’duration’:509}],’message’:’success’,’request’:{‘latitude’:37.78,’passes’:5,’longitude’:-122.41,’altitude’:100,’datetime’:1441417753}}
内容类型
服务器不仅会在生成响应时发送状态码和数据。它还发送包含有关如何生成数据以及如何对其进行解码的信息的元数据。这存储在响应头中。在大数据分析Python中,大家可以使用headers响应对象的属性来访问它。
标头将显示为字典。在标题中,content-type是目前最重要的键。它告诉大家响应的格式以及如何对其进行解码。大数据分析PythonAPI入门教程https://www.aaa-cg.com.cn/data/2308.html对于OpenNotifyAPI,格式为JSON,这就是为什么大家可以json更早地使用包对其进行解码的原因。
寻找太空中的人数
OpenNotify还有一个API端点astros.json。它告诉你当前有多少人在太空中。相应的格式可以在这里找到。
9
{‘number’:9,’people’:[{‘name’:’GennadyPadalka’,’craft’:’ISS’},{‘name’:’MikhailKornienko’,’craft’:’ISS’},{‘name’:’ScottKelly’,’craft’:’ISS’},{‘name’:’OlegKononenko’,’craft’:’ISS’},{‘name’:’KimiyaYui’,’craft’:’ISS’},{‘name’:’KjellLindgren’,’craft’:’ISS’},{‘name’:’SergeyVolkov’,’craft’:’ISS’},{‘name’:’AndreasMogensen’,’craft’:’ISS’},{‘name’:’AidynAimbetov’,’craft’:’ISS’}],’message’:’success’}
大数据分析PythonAPI数据科学教程:后续步骤
现在,您已经完成了大数据分析PythonAPI教程,现在应该可以访问简单的API并发出get请求了。requests在大家的dataquestAPI和抓取课程中,还有其他几种类型,您可以了解更多信息以及与API身份验证一起使用。
建议的其他后续步骤是阅读请求文档,并使用RedditAPI。有一个名为PRAW的程序包,它使在大数据分析Python中使用RedditAPI更加容易,但是建议requests首先使用它来了解一切的工作原理。
https://www.toutiao.com/i6832146415016215043/