GitHub的API返回有关每个仓库的大量信息:repo_dict包含68个键(见)。通过仔细查看 这些键,可大致知道可提取有关项目的哪些信息(要准确地获悉API将返回哪些信息,要么阅读 文档,要么像此处这样使用代码来查看这些信息)。 下面来提取repo_dict中与一些键相关联的值:
python_repos.py
--snip-- # 研究有关仓库的信息 repo_dicts = response_dict['items'] print("Repositories returned:", len(repo_dicts)) # 研究第一个仓库 repo_dict = repo_dicts[0] print("\nSelected information about first repository:") 1 print('Name:', repo_dict['name']) 2 print('Owner:', repo_dict['owner']['login']) 3 print('Stars:', repo_dict['stargazers_count']) print('Repository:', repo_dict['html_url']) 4 print('Created:', repo_dict['created_at']) 5 print('Updated:', repo_dict['updated_at']) print('Description:', repo_dict['description'])
在这里,我们打印了表示第一个仓库的字典中与很多键相关联的值。在1处,我们打印了项 目的名称。项目所有者是用一个字典表示的,因此在2处,我们使用键owner来访问表示所有者 的字典,再使用键key来获取所有者的登录名。在3处,我们打印项目获得了多少个星的评级, 以及项目在GitHub仓库的URL。接下来,我们显示项目的创建时间(见4)和最后一次更新的时 间(见5)。最后,我们打印仓库的描述。输出类似于下面这样:
Status code: 200 Total repositories: 713065 Repositories returned: 30 Selected information about first repository: Name: httpie Owner: jkbrzt Stars: 16101 Repository: https://github.com/jkbrzt/httpie Created: 2012-02-25T12:39:13Z Updated: 2015-07-13T14:56:41Z Description: CLI HTTP client; user-friendly cURL replacement featuring intuitive UI, JSON support, syntax highlighting, wget-like downloads, extensions, etc.
从上述输出可知,编写本书时,GitHub上星级最高的Python项目为HTTPie,其所有者为用户 jkbrzt,有16 000多个GitHub用户给这个项目加星。我们可以看到这个项目的仓库的URL,其创建 时间为2012年2月,且最近更新了。最后,描述指出HTTPie用于帮助从终端执行HTTP调用(CLI 是命令行界面的缩写)。
17.1.6 概述最受欢迎的仓库
对这些数据进行可视化时,我们需要涵盖多个仓库。下面就来编写一个循环,打印API调用 返回的每个仓库的特定信息,以便能够在可视化中包含所有这些信息:
python_repos.py
--snip-- # 研究有关仓库的信息 repo_dicts = response_dict['items'] print("Repositories returned:", len(repo_dicts)) 1 print("\nSelected information about each repository:") 2 for repo_dict in repo_dicts: print('\nName:', repo_dict['name']) print('Owner:', repo_dict['owner']['login']) print('Stars:', repo_dict['stargazers_count']) print('Repository:', repo_dict['html_url']) print('Description:', repo_dict['description'])
在1处,我们打印了一条说明性消息。在2处,我们遍历repo_dicts中的所有字典。在这个 循环中,我们打印每个项目的名称、所有者、星级、在GitHub上的URL以及描述:
Status code: 200 Total repositories: 713067 Repositories returned: 30 Selected information about each repository: Name: httpie Owner: jkbrzt Stars: 16101 Repository: https://github.com/jkbrzt/httpie Description: CLI HTTP client; user-friendly cURL replacement featuring intuitive UI, JSON support, syntax highlighting, wget-like downloads, extensions, etc. Name: django Owner: django Stars: 15028 Repository: https://github.com/django/django Description: The Web framework for perfectionists with deadlines. --snip-- Name: powerline Owner: powerline Stars: 4315 Repository: https://github.com/powerline/powerline Description: Powerline is a statusline plugin for vim, and provides statuslines and prompts for several other applications, including zsh, bash, tmux, IPython, Awesome and Qtile.
上述输出中有一些有趣的项目,可能值得再看一眼。但不要在这上面花费太多时间,因为我 们即将创建的可视化可让你更容易地看清结果。
17.1.7 监视 API 的速率限制
大多数API都存在速率限制,即你在特定时间内可执行的请求数存在限制。要获悉你是否接近了GitHub的限制,请在浏览器中输入https://api.github.com/rate_limit,你将看到类似于下面的响应:
{ "resources": { "core": { "limit": 60, "remaining": 58, "reset": 1426082320 }, 1 "search": { 2 "limit": 10, 3 "remaining": 8, 4 "reset": 1426078803 } }, "rate": { "limit": 60, "remaining": 58, "reset": 1426082320 } }
我们关心的信息是搜索API的速率限制(见1)。从2处可知,极限为每分钟10个请求,而在 当前这一分钟内,我们还可执行8个请求(见3)。reset值指的是配额将重置的Unix时间或新纪 元时间(1970年1月1日午夜后多少秒)(见4)。用完配额后,你将收到一条简单的响应,由此知 道已到达API极限。到达极限后,你必须等待配额重置。
注意
很多API都要求你注册获得API密钥后才能执行API调用。编写本书时,GitHub没有这样 的要求,但获得API密钥后,配额将高得多。
17.2 使用 Pygal 可视化仓库
有了一些有趣的数据后,我们来进行可视化,呈现GitHub上Python项目的受欢迎程度。我们 将创建一个交互式条形图:条形的高度表示项目获得了多少颗星。单击条形将带你进入项目在 GitHub上的主页。下面是首次尝试这样做:
python_repos.py
import requests import pygal from pygal.style import LightColorizedStyle as LCS, LightenStyle as LS # 执行API调用并存储响应 URL = 'https://api.github.com/search/repositories?q=language:python&sort=star' 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'] 1 names, stars = [], [] for repo_dict in repo_dicts: 2 names.append(repo_dict['name']) stars.append(repo_dict['stargazers_count']) # 可视化 3 my_style = LS('#333366', base_style=LCS) 4 chart = pygal.Bar(style=my_style, x_label_rotation=45, show_legend=False) chart.title = 'Most-Starred Python Projects on GitHub' chart.x_labels = names 5 chart.add('', stars) chart.render_to_file('python_repos.svg')
我们首先导入了pygal以及要应用于图表的Pygal样式。接下来,打印API调用响应的状态以 及找到的仓库总数,以便获悉API调用是否出现了问题。我们不再打印返回的有关项目的信息, 因为将通过可视化来呈现这些信息。
在1处,我们创建了两个空列表,用于存储将包含在图表中的信息。我们需要每个项目的名 称,用于给条形加上标签,我们还需要知道项目获得了多少个星,用于确定条形的高度。在循环 中,我们将项目的名称和获得的星数附加到这些列表的末尾2。
接下来,我们使用LightenStyle类(别名LS)定义了一种样式,并将其基色设置为深蓝色(见 3)。我们还传递了实参base_style,以使用LightColorizedStyle类(别名LCS)。然后,我们使用 Bar()创建一个简单的条形图,并向它传递了my_style(见4)。我们还传递了另外两个样式实参: 让标签绕x轴旋转45度(x_label_rotation=45),并隐藏了图例(show_legend=False),因为我们 只在图表中绘制一个数据系列。接下来,我们给图表指定了标题,并将属性x_labels设置为列表 names。
由于我们不需要给这个数据系列添加标签,因此在5处添加数据时,将标签设置成了空字符 串。生成的图表如图17-1所示。从中可知,前几个项目的受欢迎程度比其他项目高得多,但所有 这些项目在Python生态系统中都很重要。
17.2.1 改进 Pygal 图表
下面来改进这个图表的样式。我们将进行多个方面的定制,因此先来稍微调整代码的结构, 创建一个配置对象,在其中包含要传递给Bar()的所有定制:
python_repos.py
--snip-- # 可视化 my_style = LS('#333366', base_style=LCS) 1 my_config = pygal.Config() 2 my_config.x_label_rotation = 45 my_config.show_legend = False 3 my_config.title_font_size = 24 my_config.label_font_size = 14 my_config.major_label_font_size = 18 4 my_config.truncate_label = 15 5 my_config.show_y_guides = False 6 my_config.width = 1000 7 chart = pygal.Bar(my_config, style=my_style) chart.title = 'Most-Starred Python Projects on GitHub' chart.x_labels = names chart.add('', stars) chart.render_to_file('python_repos.svg')
在1处,我们创建了一个Pygal类Config的实例,并将其命名为my_config。通过修改my_config 的属性,可定制图表的外观。在2处,我们设置了两个属性——x_label_rotation和show_legend, 它们原来是在创建Bar实例时以关键字实参的方式传递的。在3处,我们设置了图表标题、副标 签和主标签的字体大小。在这个图表中,副标签是x轴上的项目名以及y轴上的大部分数字。主标 签是y轴上为5000整数倍的刻度;这些标签应更大,以与副标签区分开来。在4处,我们使用 truncate_label将较长的项目名缩短为15个字符(如果你将鼠标指向屏幕上被截短的项目名,将 显示完整的项目名)。接下来,我们将show_y_guides设置为False,以隐藏图表中的水平线(见5)。 最后,在处设置了自定义宽度,让图表更充分地利用浏览器中的可用空间。
在7处创建Bar实例时,我们将my_config作为第一个实参,从而通过一个实参传递了所有的 配置设置。我们可以通过my_config做任意数量的样式和配置修改,而7处的代码行将保持不变。 图17-2显示了重新设置样式后的图表。