经常使用Excel,学习VBA还是PYTHON哪个容易学我是四十岁大叔

在有关大数据分析Python API的本教程中,我们将学习如何从远程网站检索数据以进行数据科学项目 。像baidu,Twitter和Facebook之类的网站都通过其应用程序编程接口(API)向程序员提供某些数据 。要使用API,你需要向远程Web服务器发出请求,然后检索所需的数据 。
但是,为什么要使用API而不是可以下载的静态数据集呢?API在以下情况下很有用:
a.数据变化很快 。股票价格数据就是一个例子 。重新生成数据集并每分钟下载一次并没有实际意义-这会占用大量带宽,而且速度很慢 。
b.您需要一小部分更大的数据 。Reddit评论就是一个例子 。如果您只想在Reddit上发表自己的评论该怎么办?下载整个Reddit数据库,然后仅过滤您自己的注释并没有多大意义 。
c.涉及重复计算 。Spotify的API可以告诉您音乐的流派 。从理论上讲,您可以创建自己的分类器,并使用它对音乐进行分类,但您将永远不会拥有Spotify所拥有的数据 。
在上述情况下,API是正确的解决方案 。对于本数据科学教程,我们将查询一个简单的API,以检索有关国际空间站(ISS)的数据 。使用API可以节省我们自己进行所有计算的时间和精力 。
大数据分析Python中的API请求
API托管在Web服务器上 。当您***在浏览器的地址栏中键入内容时,您的计算机实际上是在向***服务器询问网页,然后该网页返回到您的浏览器 。
API的工作方式几乎相同,除了您的程序要求数据而不是您的Web浏览器询问网页之外 。这些数据通常以JSON格式返回(有关更多信息,请参阅有关使用JSON数据的教程) 。
为了获取数据,我们向Web服务器发出请求 。然后,服务器将回复我们的数据 。在大数据分析Python中,我们将使用请求库来执行此操作 。在此大数据分析Python API教程中,我们将为所有示例使用大数据分析Python 3.4 。
请求类型
有许多不同类型的请求 。最常用的一个GET请求用于检索数据 。
我们可以使用一个简单的GET请求从OpenNotify API 检索信息 。
OpenNotify具有多个API端点 。端点是用于从API检索不同数据的服务器路由 。例如,/commentsReddit API上的端点可能会检索有关注释的信息,而/users端点可能会检索有关用户的数据 。要访问它们,您可以将端点添加到API 的基本URL中 。
我们将在OpenNotify上看到的第一个端点是iss-now.json端点 。该端点获取国际空间站的当前纬度和经度 。如您所见,检索此数据不适用于数据集,因为它涉及服务器上的一些计算,并且变化很快 。
您可以在此处查看OpenNotify上所有端点的列表 。
OpenNotify API 的基本网址是***,因此我们将其添加到所有端点的开头 。

经常使用Excel,学习VBA还是PYTHON哪个容易学我是四十岁大叔

文章插图
状态码
我们刚刚发出的请求的状态码为200 。向Web服务器发出的每个请求都返回状态代码 。状态代码指示有关请求发生的情况的信息 。以下是与GET请求相关的一些代码:
经常使用Excel,学习VBA还是PYTHON哪个容易学我是四十岁大叔

文章插图
a)200 -一切正常,结果已返回(如果有)
b)301—服务器正在将您重定向到其他端点 。当公司切换域名或更改端点名称时,可能会发生这种情况 。
c)401-服务器认为您未通过身份验证 。当您没有发送正确的凭据来访问API时就会发生这种情况(我们将在以后的文章中讨论身份验证) 。
d)400-服务器认为您提出了错误的请求 。当您没有正确发送数据时,可能会发生这种情况 。
e)403 —您尝试访问的资源被禁止—您没有正确的权限查看它 。
f)404 -在服务器上找不到您尝试访问的资源 。
现在***/iss-pass,根据API文档,向不存在的端点发出GET请求 。
击中正确的终点
iss-pass不是有效的端点,因此我们得到了一个404状态码作为相应 。.json正如API文档所述,我们忘记在最后添加 。
现在,我们将向发出GET请求***/iss-pass.json 。
经常使用Excel,学习VBA还是PYTHON哪个容易学我是四十岁大叔

文章插图
查询参数
您将在上一个示例中看到,我们得到了一个400状态码,表示请求错误 。如果您查看OpenNotify API的文档,我们会发现ISS Pass端点需要两个参数 。
当ISS下次通过地球上的给定位置时,将返回ISS Pass端点 。为了对此进行计算,我们需要将位置的坐标传递给API 。为此,我们传递了两个参数-纬度和经度 。
为此,我们可以在params请求中添加可选的关键字参数 。在这种情况下,我们需要传递两个参数: