参考书籍:《python编程从入门到实践》
使用web应用编程接口(API)自动请求网站特定信息而不是整个网页,再对这些信息进行可视化,因为这样的程序始终使用最新的数据来生成可视化,因此即使数据瞬息万变,它呈现的信息也都是最新的。请求的数据的数据格式是Json或者cvs。
下面的例子是对于github的的一个数据请求:调用返回github当前托管了多少个项目,还有有关最受欢迎的python仓库的信息。
1、使用api调用请求数据:
https://api.github.com/search/repositories?q=language:python&sort=stars
(https://api.github.com/)将请求发送到github网络中响应api调用部分
(search/repositories)让api搜索github上的所有仓库
(?)指出我们要传递一个实参
(q=)q表示查询,等号让我们开始指定查询
(language:python)指定语言为python
(sort=stars)将指定项目按照星星进行排序
下面是响应返回的前几行信息:
{
"total_count": 4982671,
"incomplete_results": true,
"items": [
{
"id": 54346799,
"node_id": "MDEwOlJlcG9zaXRvcnk1NDM0Njc5OQ==",
"name": "public-apis",
"full_name": "public-apis/public-apis",
"private": false,
--snip--
( "incomplete_results": true,)说明github无法全面处理该API,如果全面处理返回值为false(它并非不完整的)
2、下面的程序是处理API响应:
# -*- encoding: utf-8 -*-
import requests
url = 'https://api.github.com/search/repositories?q=language:python&sort=stars'
r = requests.get(url)
print("Status code:", r.status_code) #返回状态码,200即使请求成功
#将api响应存储在一个变量中
response_dict=r.json()
#处理结果
#print(response_dict.keys())
#结果:dict_keys(['total_count', 'incomplete_results', 'items'])
print("Total repositories:", response_dict['total_count']) #指出github中总共有多少个python仓库
#incomplete_results:值为false,据此知道请求是成功的(它并非不完整的),如果github无法全面处理该api,它会返回这个值为true
#探索有关仓库的信息
repo_dicts = response_dict['items'] #'items'相关联的是一个列表
print("repositories retuned:",len(repo_dicts)) #打印列表的长度来获悉我们得到多少个仓库的信息
#研究第一个仓库
# repo_dict=repo_dicts[0]
# print("\nkeys:",len(repo_dict)) #打印字典的键值,看看其中包含多少信息
# for key in sorted(repo_dict.keys()):
# print(key)
#打印每一个仓库以下的内容
print("\nSelected information about each repository:")
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']) #仓库的url
print('Created:',repo_dict['created_at']) #创建时间
print('Updated:',repo_dict['updated_at']) #最后一次更新时间
print('Description:',repo_dict['description']) #仓库的描述
3、API的速率限制(rate_limit)
对于API的请求不是没有限制的,在特定的时间可执行的请求数是存在限制的,要知道请求次数是否接近极限可以在浏览器中输入进行查询,在这里我就不进行详细说明了,当请求配额用完的时候只能等配额重置,这里一般等几分钟就会重置。
4、对仓库可视化(pygal)
import pygal
from pygal.style import LightColorizedStyle as LCS, LightenStyle as LS
import requests
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(response_dict.keys())
#结果:dict_keys(['total_count', 'incomplete_results', 'items'])
print("Total repositories:", response_dict['total_count']) #指出github中总共有多少个python仓库
#incomplete_results:值为false,据此知道请求是成功的(它并非不完整的),如果github无法全面处理该api,它会返回这个值为true
#探索有关仓库的信息
repo_dicts = response_dict['items'] #'items'相关联的是一个列表
names, stars = [], []
for repo_dict in repo_dicts:
names.append(repo_dict['name'])
stars.append(repo_dict['stargazers_count'])
#可视化
my_style = LS('#333366', base_style=LCS)
my_config = pygal.Config() #创建一个pygal类Config的实例,通过修改my_config的属性,可定制图标的外观
my_config.x_label_rotation = 45
my_config.show_legend = False #隐藏图例
my_config.title_font_size = 24
my_config.label_font_size = 14 #副标签:x轴上的项目名和y轴上的大部分数字
my_config.major_label_font_size = 18 #主标签:是y轴上为5000整数倍的刻度,这些标签应该更大,和副标签区分开来
my_config.truncate_label = 15 #将项目名字太长的项目名缩短为15个字符(如果将鼠标指向屏幕上被截短的项目名,将看到完整的名字
my_config.show_y_guides = False #隐藏图标的水平线
my_config.width = 1000 #设置自定义宽度
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')
5、添加自定义工具
将鼠标指向条形将显示它表示的信息,称为工具提示,下面来创建一个自定义工具提示,显示项目的描述,为此,我们要向向add传递一个字典列表,而不是值列表。
只需要修改其中一部分代码即可:
names,plot_dicts = [], []
for repo_dict in repo_dicts:
names.append(repo_dict['name'])
plot_dict={'value':repo_dict['stargazers_count'], 'label':repo_dict['description']}
plot_dicts.append(plot_dict)
--snip--
chart.add('',plot_dicts)
6、在图表中添加可单击的链接
只需要在上面的字典列表中添加多一个键值对就可以了
for repo_dict in repo_dicts:
names.append(repo_dict['name'])
plot_dict={'value':repo_dict['stargazers_count'],'label':repo_dict['description'],'xlink':repo_dict['html_url'],}
plot_dicts.append(plot_dict)
--snip--
chart.add('',plot_dicts)
这样pygal就会根据与键‘xlink'相关联的URL将每个条形都转换为活跃的链接,单击图表中的任何条形时,都将在浏览器中打开一个新的标签页,并在其中显示相应项目的github页面,感觉非常的神奇。
在这里会发现同一个项目在昨天和今天它的星星数是不一样的,因为是用的web api请求的网页数据,数据是跟着网页数据进行变化的,这样就很方便,数据不会是一成不变的。
网友评论