数据可视化:使用API

来源:《Python编程:从入门到实践》

1 使用Web API

  • Web API是网站的一部分,用于与使用非常具体的URL请求特定信息的程序交互——这种请求称为API调用
  • 请求的数据将以易于处理的格式(JSON/CSV)返回
  • 依赖于外部数据源的大多数应用程序都依赖于API调用

1.1 Git 和 GitHub

  • 这里将使用GitHub的API来请求有关该网站中Python项目的信息,然后使用Pygal生成交互式可视化,以呈现这些项目的受欢迎程度
  • GitHub(https://github.com)的名字源自Git,Git是一个分布式版本控制系统,让程序员团队能够协作开发项目
  • 对于喜欢的项目,GitHub用户可给它加星(star)以表示支持,用户还可跟踪他可能想使用的项目
  • 本章将编写一个程序,它自动下载GitHub上星际最高的Python项目的信息,并对这些信息进行可视化

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并不适合人工输入
{
  "total_count": 4149745,
  "incomplete_results": false,
  "items": [
    {
      "id": 21289110,
      "node_id": "MDEwOlJlcG9zaXRvcnkyMTI4OTExMA==",
      "name": "awesome-python",
      "full_name": "vinta/awesome-python",
      --snip--

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 从第二行输出可知,当前GitHub总共有4149745个Python项目
  • “incomplete_results”: false,据此可知请求是成功的(如果无法全面处理该API,将返回true
  • "items"其中包含GitHub上最受欢迎的Python项目的详细信息

1.3 安装requests

  • requests包让Python程序能够轻松地向网站请求信息以及检查返回的响应
  • 安装requests,执行下面的命令
$ pip install --user requests

   
   
  • 1

1.4 处理API响应

  • 下面来编写一个程序,它执行API调用并处理结果,找出GitHub上星级最高的Python项目

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(response_dict.keys())

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 导入模块requests
  • url存储API调用的URL,然后使用requests执行调用
  • 调用get()并将URL传递给它,再将响应对象存储在变量r中
  • 响应对象包含一个名为status_code的属性,它告诉我们请求是否成功了(状态码200表示请求成功
  • 这个API返回JSON格式的信息,因此使用方法json()将这些信息转换为一个Python字典
  • 将得到的字典存储在response_dict中
    在这里插入图片描述
  • 看输出,知道了请求成功了,且响应字典包含三个键:‘total_count’, ‘incomplete_results’, ‘items’

1.5 处理响应字典

  • 下面来生成一些概述这些信息的输出

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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 首先打印了与total_count关联的值,它指出当前GitHub总共包含多少个Python仓库
  • 与’items’相关联的值是一个列表,其中包含很多字典,每个字典包含有关一个Python仓库的信息
    在这里插入图片描述
  • 通过仔细查看这些键,可大致知道可提取有关项目的哪些信息
  • 下面来提取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’])

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在这里插入图片描述

1.6 概述最受欢迎的仓库

  • 下面编写一个循环,打印API调用返回的每个仓库的特定信息,以便在可视化中包含所有这些信息:

python_repos.py

--snip--
# 探索有关仓库的信息
repo_dicts = response_dict['items']
print("Repositories returned:", len(repo_dicts))

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’])
print(‘Description:’, repo_dict[‘description’])

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 打印每个项目的名称、所有者、星级、在GitHub上的URL及描述:
    在这里插入图片描述

1.7 监视API的速率限制

  • 大多数API都存在速率限制,即你在特定时间内可执行的请求数存在限制
  • 要获悉你是否接近了GitHub的限制,可在浏览器中输入:https://api.github.com/rate_limit
{
  "resources": {
    "core": {
      "limit": 60,
      "remaining": 60,
      "reset": 1566879699
    },
    "search": {
      "limit": 10,
      "remaining": 10,
      "reset": 1566876159
    },
    "graphql": {
      "limit": 0,
      "remaining": 0,
      "reset": 1566879699
    },
    "integration_manifest": {
      "limit": 5000,
      "remaining": 5000,
      "reset": 1566879699
    }
  },
  "rate": {
    "limit": 60,
    "remaining": 60,
    "reset": 1566879699
  }
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 从上面可知,极限为每分组10个请求
  • reset值指的是配额将重置的Unix时间或新纪元时间(1970年1月1日午夜后多少秒)
  • 用完配额后,你将收到一条简单的响应,由此知道已达到API极限
  • 达到极限后,必须等待配额重置

注意: 很多API都要求你注册获得API密钥后才能执行API调用

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值