Python数据可视化day06|使用API

2018-04-23  本文已影响0人  习惯芥末味

学习如何编写一个独立的程序,并对其获取的数据进行可视化。这个程序将使用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项目图表
上一篇下一篇

猜你喜欢

热点阅读