在本章中,我们将学习如何编写一个独立的程序,并对其获取的数据进行可视化。这个程序将使用Web应用编程接口(API)自动请求网站的特定信息而不是整个网页,再对这些信息进行可视化。由于这样编写的程序始终使用最新的数据来生成可视化,因此即便数据瞬息万变,它呈现的信息也都是最新的。

17.1  使用Web API

Web API是网站的一部分,用于与使用非常具体的URL请求特定信息的程序交互。这种请求称为API调用。请求的数据将易于处理的格式(如JSON或CSV)返回。

依赖于外部数据源的大多数应用程序都依赖于API调用,如集成社交媒体网站的应用程序。

17.1.1  Git和GitHub

本章的可视化将基于来自GitHub的信息,这是一个让程序员能够协作开发项目的网站。我们将使用GitHub的API来请求有关该网站中Python项目的信息,然后使用Pygal生成交互式可视化,以呈现这些项目的受欢迎程度。

GitHub(https://githu.com/)的名字源自Git,Git是一个分布式版本控制系统,让程序员团队能够协作开发项目。Git帮助大家管理为项目所做的工作,避免一个人所做的修改影响其他人所做的修改。我们在项目中实现新功能时,Git将跟踪我们对每个文件所做的修改。确定代码可行后,我们提交所做的修改,而Git

将记录项目最新的状态。如果我们犯了错,想撤销所做的修改,可轻松地返回以前的任何可行状态。GitHub上的项目都存储在仓库中,后者包含于项目相关联的一切:代码、项目参与者的信息、问题或bug报告等。

对于喜欢的项目,GitHub用户可给它加星(star)以表示支持,用户还可跟踪他可能想使用的项目。在本章中,我们将编写一个程序,它自动下载GitHub上星际最高的Python项目的信息,并对这些信息进行可视化。

17.1.2  使用API调用请求数据

GitHub的API让我们能够通过API调用来请求各种信息。要知道API调用是什么样的,请在浏览器的地址栏中输入如下地址并按回车键:

https://api.github.com/search/repositories?q=language:python&sort=stars

这个调用返回GitHub当前托管了多少个Python项目,还有有关最受欢迎的Python仓库的信息。下面来仔细研究这个调用。第一部分(https://api.github.com/)将请求发送到GitHub网站中相应API调用的部分;接下来的一部分(search/repositories)让API搜索GitHub上的所有仓库。

repositories后面的问号指出我们要传递一个实参。q表示查询,而等号让我们能够开始指定查询(q=).通过使用language:python,我们指出只想获取只要语言为Python的仓库信息。最后一部分(%sort=stars)指定将项目按其获得的星级进行排序。

下面显示了相应的前几行。从响应可知,该URL并不适合人工输入。

  从第二行输出可知,编写本书时,GitHub总共有713062个Python项目。‘incomplete_results"的值为False,据此我们知道请求是成功的。倘若GitHub无法全面处理该API,他返回的这个值将为True,接下来的列表中显示了返回的'items',其中包含GitHub上最受欢迎的Python项目的详细信息。

17.1.4  处理API响应

下面来编写一个程序,它执行API调用并处理结果,找出GitHub上星级最高的Python项目:

python_repos.py                                                                        --(1)

import requests

#执行API调用并存储响应

url = 'https://api.github.com/search/repositories?q=language:python&sort=stars'        --(2)

r = requests.get(url)                                                                  --(3)

print("Status code:",r.status_code)                                                    --(4)

#将API响应存储在一个变量中

response_dict = r.json()                                                                --(5)

#处理结果

print(response_dict.keys())

在(1)处,我们导入了模块requests.在(2)处,我们存储API调用的URL,然后使用requests来执行调用(见(3))。我们调用get()并将URL传递给它,在将

响应的对象存储在变量r中。响应对象包含一个名为status_code的属性,它让我们知道请求是否成功了(状态码200表示请求成功)。在(4)处,我们打印status_code的属性,核实调用是否成功了。

这个API返回JSON格式的信息,因此我们使用方法json()将这些信息转换为一个Python字典(见(5))。我们将转换得到的字典存储在response_dict中。

最后,我们打印response_dict中的键。输出如下:

  Status code: 200
  dict_keys(['total_count', 'items', 'incomplete_results'])

状态码为200,因此我们知道请求成功了。响应字典只包含三个键:’items','total_count','incomplete_results'.

17.1.5  处理响应字典

将API调用返回的信息存储到字典后,就可以处理这个字典中的数据了。下面来生成一些概述这些信息的输出。这是一种不错的输出方式,可确认收到了期望的信息,进而可以开始研究感兴趣的信息:

import requests

#执行API调用并存储响应
url = 'https://api.github.com/search/repositories?q=language:python&sort=stars'
r = requests.get(url)
print("Status code:",r.status_code)

#将API响应存储在一个变量中
response_dict = r.json()

#处理结果
print("Total repositories:",response_dict["total_count"])

#探索有关仓库的信息
repo_dicts = response_dict['items']
print("Repositories returned:",len(repo_dicts))

#研究第一个仓库
repo_dict = repo_dicts[0]
print("\nKeys:",len(repo_dict))
for key in sorted(repo_dict.keys()):
print(key)

  在(1)处,我们打印了与'total_count'相关联的值,它指出了GitHub总共包含多少个Python仓库。与'items'相关联的值是一个列表,其中包含很多字典,而每个字典都包含有关一个Python仓库的信息。在(2)处,我们将这个字典列表存储在repo_dicts中。接下来,我们打印repo_dicts的长度,以获悉我们获得了多少个仓库的信息。

为更深入地了解返回的有关每个仓库的信息,我们提取了repo_dicts中的第一个字典,并将其存储在repo_dict中。接下来,我们打印这个字典包含的键数,看看其中有多少信息。在(5)处,我们打印这个字典的所有键,看看其中包含那些信息。

输出让我们对实际包含的数据有了更清晰的认识:

第 17 章 使用API的更多相关文章

  1. 【STM32H7教程】第17章 STM32H7之GPIO的HAL库API

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第17章       STM32H7之GPIO的HAL库API ...

  2. JavaScript高级程序设计(第三版)学习笔记11、12、17章

    章, DOM扩展 选择符 API Selector API Level1核心方法querySelector .querySelectorAll,兼容的浏览器可以使用 Document,Element  ...

  3. 【RL-TCPnet网络教程】第17章 RL-TCPnet之UDP通信

    第17章      RL-TCPnet之UDP通信 本章节为大家讲解RL-TCPnet的UDP通信实现,学习本章节前,务必要优先学习第16章UDP用户数据报协议基础知识.有了这些基础知识之后,再搞本章 ...

  4. 《Linux内核设计与实现》第17章学习笔记

    第17章.设备与模块 17.1设备类型 1.块设备(blkdev): 寻址以块为单位,通常支持重定位操作.通过称为“块设备节点”的特殊文件来访问. 2.字符设备(cdev): 不可寻址,仅提供数据的流 ...

  5. java JDK8 学习笔记——第15章 通用API

    第十五章 通用API 15.1 日志 15.1.1 日志API简介 1.java.util.logging包提供了日志功能相关类与接口,不必额外配置日志组件,就可在标准Java平台使用是其好处.使用日 ...

  6. CSS3秘笈第三版涵盖HTML5学习笔记13~17章

    第13章,构建基于浮动的布局 使用的是float(浮动)属性 注:float:none值将取消所有浮动,通常只用来取消元素中已经应用的浮动. 切记:不需要给正文的div设计宽度,即使设计成固定宽度也不 ...

  7. 《深入Java虚拟机学习笔记》- 第17章 异常

    <深入Java虚拟机学习笔记>- 第17章 异常

  8. C++ Primer Plus 文章17章 进,输出和文件

    文章17章 进.输出和文件 1.当到达输入句子.他将刷新输出缓冲区满输出电流 2.streambuf分类 它提供了用于各种操作的一个缓冲 ios_base类表示流的一般特征 ios基础的类ios_ba ...

  9. 第17章 中介者模式(Mediator Pattern)

    原文 第17章 中介者模式(Mediator Pattern) 中介者模式  概述:   在软件开发中,我们有时会碰上许多对象互相联系互相交互的情况,对象之间存在复杂的引用关系,当需求更改时,对系统进 ...

随机推荐

  1. go的web框架beego

    安装 beego 包含一些示例应用程序以帮您学习并使用 beego 应用框架. 您需要安装 Go 1.1+ 以确保所有功能的正常使用. 你需要安装或者升级 Beego 和 Bee 的开发工具: $ g ...

  2. PID控制算法的C语言实现四 增量型PID的C语言实现

    /*------------------------------------------- 2 位置型PID C实现(控制电机转速) --------------------------------- ...

  3. 美化mfc界面,给mfc界面加上皮肤

    注明:里面使用到的资源文件在自己的腾讯微云有. 原图: 添加皮肤后: 通过对比就能知道,加上皮肤后给人的感觉就是耳目一新了. 技术详细说明: 这里用到的是一个轻量型的美化工具SkinSharp又称Sk ...

  4. poj3254 Corn Fields

    orn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17989   Accepted: 9474 Descr ...

  5. [CodeForces]String Reconstruction

    http://codeforces.com/contest/828/problem/C 并查集的神奇应用. #include<bits/stdc++.h> using namespace ...

  6. linux的进程1:rootfs与linuxrc

    在内核启动的最后阶段启动了三个进程 进程0:进程0其实就是刚才讲过的idle进程,叫空闲进程,也就是死循环.进程1:kernel_init函数就是进程1,这个进程被称为init进程.进程2:kthre ...

  7. 基于javaWeb阶段下的Servlet总结

    1. Servlet概述   Servlet是用Java语言编写的服务端的程序,采用request--response模式提供Web服务,并且支持标准ServletAPI,Servlet就一个运行在w ...

  8. 用Tensorflow实现多层神经网络

    用Tensorflow实现多层神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 Tensorflow机器学习实战指南 源代码请点击下方链接欢迎加星 ReLU激活函数/L1范数 ...

  9. 【LibreOJ】#6298. 「CodePlus 2018 3 月赛」华尔兹 BFS

    [题意]给定n*m的网格,起点和终点位置,一些格指定下一步的方向,一些格任意.要求为方向任意的格确定方向,使起点可以走到终点.n,m<=50. [算法]BFS [题解]这道题最好用BFS,因为D ...

  10. 【CodeForces】899 F. Letters Removing

    [题目]F. Letters Removing [题意]给定只含小写字母.大写字母和数字的字符串,每次给定一个范围要求删除[l,r]内的字符c(l和r具体位置随删除变动),求m次操作后的字符串.n&l ...