在本章中,我们将学习如何编写一个独立的程序,并对其获取的数据进行可视化。这个程序将使用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. windows下php扩展存在但无法加载的问题

    1.可能存在多个php环境,扩展没有放对地方 2.扩展和php版本不对应,例如,php是32位,扩展是64位:或者php是nts版本,但是扩展不是nts版本.

  2. opencv函数制作的秒针模型

    曾经做过,没想到这次再次写这篇代码却用了这么久的时间.这回我要记住他. #include"cv.h" #include"highgui.h" int main( ...

  3. 题解 P1345 【[USACO5.4]奶牛的电信Telecowmunication】

    P1345 [USACO5.4]奶牛的电信Telecowmunication 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮 ...

  4. MyEclipse解决Launching xx on MyEclipse Tomcat has encountered a problem

    单击工具栏Run,选中Run Configurations... 将MyEclipse Server Application里面的工程右击选择Delete就好了.

  5. BZOJ 2083 vector的巧用+二分

    2083: [Poi2010]Intelligence test Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 469  Solved: 227[Su ...

  6. CF540 D 概率 DP

    石头剪刀布三种生物(?) 随机战斗,最后三方各自只有自己方存活下来的概率是多少. 局面的转移明显,注意任选两方决定战斗时有可能出现选了同个种类的,因此注意排除掉同种的组合,也就是条件概率什么的. /* ...

  7. Linux改变用户shell的类型

    命令: 改变usr01的类型 # usermod -s /bin/csh usr01

  8. 开发技巧:高效的使用 Response.Redirect

    我正在评估一个 ASP.NET Web 项目应用.它有一些可扩展性问题.意味着当网站访问量增加的时候.系统将会变得缓慢.当我查看应用日志.我找到了大量的 ThreadAbortException. 这 ...

  9. LintCode 397: Longest Increasing Continuous Subsequence

    LintCode 397: Longest Increasing Continuous Subsequence 题目描述 给定一个整数数组(下标从0到n - 1,n表示整个数组的规模),请找出该数组中 ...

  10. [转]C语言指针详解(经典,非常详细)

    博文地址:https://blog.csdn.net/constantin_/article/details/79575638 写得很好啊! 这里写一下笔记好了 int p; //这是一个普通的整型变 ...