学习如何编写一个独立的程序,并对其获取的数据进行可视化。这个程序将使用Web应用编程接口 (API)自动请求网站的特定信息而不是整个网 页,再对这些信息进行可视化。
使用API
调用请求数据(基于GitHub
的信息)
调用AIP
分两部分:
第一部分:将请求发送 到GitHub
网站中响应API
调用的部分;
第二部分:让API
搜索GitHub
上的所有仓库
例如:
https://api.github.com/search/repositories?q=language:python&sort=stars
repositories
后面的问号指出我们要传递一个实参。q
表示查询,而等号让我们能够开始指定查询(q= )
。通过使用language:python
,我们指出只想获取主要语言为 Python的仓库的信息。最后一部分(&sort=stars )
指定将项目按其获得的星级进行排序。
安装requests
$ pip install --user requests
处理API响应
➜ python_repos.py
import requests #导入模块requests
# 执行API调用并存储响应
url = 'https://api.github.com/search/repositories?q=language:python&sort=stars'
r = requests.get(url) #get请求方式
print("Status code:", r.status_code) #status_code合适调用是否成功
# 将API响应存储在一个变量中
response_dict = r.json() #将返回的json信息转换为python字典
# 处理结果
print(response_dict.keys())
打印response_dict
中的键:
Status code: 200
dict_keys(['items', 'total_count', 'incomplete_results'])
状态码为200
,因此我们知道请求成功了。响应字典只包含三个键:'items
'、'total_count
' 和'incomplete_results
'
处理响应字典
将API调用返回的信息存储到字典中后,就可以处理这个字典中的数据了
➜ python_repos.py
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)
我们打印这个字典的所有键,看看其中包含哪些信息,输出让我们对实际包含的数据有了更清晰的认识:
Status code: 200
Total repositories: 713062
Repositories returned: 30
Keys: 68
archive_url assignees_url blobs_url
--snip--
url
watchers
watchers_count
提取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:")
print('Name:', repo_dict['name']) #项目名称
print('Owner:', repo_dict['owner']['login']) #所有者登录名
print('Stars:', repo_dict['stargazers_count']) #获取星级
print('Repository:', repo_dict['html_url'])
print('Created:', repo_dict['created_at']) #项目创建时间
print('Updated:', repo_dict['updated_at']) #项目最后一次更新时间
print('Description:', repo_dict['description'])
输出结果:
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.
概述最受欢迎的仓库
打印API调用返回的每个仓库的特定信息,以便能够在可视化中包含所有这些信息:
➜ python_repos.py
--snip--
# 探索有关仓库的信息
repo_dicts = response_dict['items']
print("Repositories returned:", len(repo_dicts))
print("\nSelected information about first repository:") #打印了一条说明性消息
for repo_dict in repo_dicts: #遍历repo_dicts 中的所有字典
print('Name:', 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'])
输出结果:
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.
监视API的速率限制
大多数API都存在速率限制,即你在特定时间内可执行的请求数存在限制。
{
"resources": {
"core": {
"limit": 60,
"remaining": 58,
"reset": 1426082320
},
❶ "search": {
❷ "limit": 10,
❸ "remaining": 8,
❹ "reset": 1426078803
}
},
"rate": {
"limit": 60,
"remaining": 58,
"reset": 1426082320
}
}
我们关心的信息是搜索API的速率限制(见❶)。从❷处可知,极限为每分钟10个请求,而在当前这一分钟内,我们还可执行8个请求(见❸)。reset 值指的是配额将重置的 Unix时间或新纪元时间 (1970年1月1日午夜后多少秒)(见❹)。用完配额后,你将收到一条简单的响应,由此知道已到达API极限。到达极限后,你必须等待配额重置。
注意:很多API都要求你注册获得API密钥后才能执行API调用。
使用Pygal可视化仓库
有了一些有趣的数据后,我们来进行可视化,将创建一个交互式条形图
➜ python_repos_pygal.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=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']
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) #将基色设置为深蓝色
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
chart.add('', stars) #添加数据
chart.render_to_file('python_repos.svg')
GitHub上受欢迎程度最高的Python项目图表
网友评论