Python/使用API


本篇将编写一个独立程序,并对所获取的数据进行可视化。这个程序将使用web应用编程接口API自动请求网站的特定信息而不是整个网页,数据是随网站更新,因此具有时时性

使用Web API

访问github API

Web API是网站的一部分,用于与使用非常具体的URL请求特定信息的程序交互。这种请求称为API调用
使用API请求数据
访问url:https://api.github.com/search/repositories?q=language:python&sort=starts
这个调用返回GitHub当前托管了多少这个调用个python项目,还有最受欢迎的python库的信息
(https://api.github.com/)将请求发送到GitHub网站中响应API调用的部分;(search/repositories)让API搜索GitHub上的所有仓库;q表示查询,而等号让我们能够开始指定查询(q=);通过使用language:python,我们指出只想获取主要语言为Python的仓库的信息;(&sort=stars)指定将项目按其获得的星级进行排序

从响应的结果显示,该url不适合人工输入。因此需要用到requests库来处理API的响应结果

# python_repos.py
import requests
url='https://api.github.com/search/repositories?q=language:python&sort=starts'
r=requests.get(url)
# 将API响应结果存储
print('Status code:', r.status_code)
# status_code属性反应请求状态是否成功
reponse_dict=r.json()
# 使用json()方法将响应结果转换为python字典---json格式
print(reponse_dict.keys())
# 返回的结果
Status code: 200
dict_keys(['items', 'total_count', 'incomplete_results'])

得到json格式的响应结果后,可以进行处理数据

# python_repos.py
--snip--
print('total repositories:', response_dict['total_count'])
# 获取repositoreis项目总数---属性
repo_dicts=response_dict['items']
print('repositories returned:', len(repo_dicts))
repo_dict=repo_dicts[0]
# 获取第一个项目
print('\nKeys: ', len(repo_dict))
# 获取该项目的key数量
for n, key in enumerate(sorted(repo_dict.keys())): 
    print(key)
    # 打印该项目的key

访问hacker news API

Hacker News,在Hacker News网站,用户分享编程和技术方面的文章
文章举例url 调用此url返回最热门的文章的信息ID为9884165文章信息json
下面执行一个API调用,返回Hacker News上当前热门文章ID,再查看每篇排名靠前的文章

# hn_submissions.py
import requests
from operator import itemgetter

url = 'https://hacker-news.firebaseio.com/v0/topstories.json'
URL = 'https://hacker-news.firebaseio.com/v0/item/'
r = requests.get(url)
print('status code: ', r.status_code)

submission_ids = r.json()
submission_dicts = []
for submission_id in submission_ids[:10]:
    url = URL + str(submission_id)+'.json'
    submission_r = requests.get(url)
    print(submission_r.status_code)
    response_dict = submission_r.json()
    submission_dict = {
        'title': response_dict['title'], 'link': 'http://news.ycombinator.com/item?id='+str(submission_id), 'comments': response_dict.get('descendants', 0)}
    submission_dicts.append(submission_dict)
submission_dicts = sorted(
    submission_dicts, key=itemgetter('comments'), reverse=True)
# 使用operator库中itemgetter()函数,传入参数comments,因此它将从这个列表的每个字典中key=commnets关联,进行排序;参数reverse输入True,即可实现comments从多到少排列
for submission_dict in submission_dicts:
    print('\nTitle:', submission_dict['title'])
    print('Discussion link:', submission_dict['link'])
    print('Comments:', submission_dict['comments'])

改进Pygal图表

将创建一个交互式条形图:条形图的高度表示获得了多少颗星,单机条形将带你进入项目在github上的主页

# python_repos_visual.py
import requests
import pygal
from pygal.style import LightColorizedStyle as LCS, LightenStyle as LS
URL='https://api.github.com/search/repositories?q=language:python&sort=starts'
r=requests.get(URL)
print('status code', r.status_code)
response_dict=r.json()
repo_dicts=response_dict['items']
names, starts =[], []
for repo_dict in repo_dicts:
    names.append(repo_dict['name'])
    starts.append(repo_dict['stargzers_count'])
    
my_style=LS('#3333366', base_style=LCS)
# 使用LightenStyle类定义了一种样式,将基色设置为深蓝色,并在pygal.Bar()创建条形图实例时传递给参数style
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('starts', starts)
chart.render_to_file('images/python_repos_visual.svg')

在这里插入图片描述
在以上实例中,鼠标指向条形码区域会显示获得的星数,这称为工具提示。下面创建一个自定义工具提示,以同时显示项目描述。
给pygal.add()传递一个字典列表,而不是数值列表,字典列表包含starts—星数,label—项目描述

--snip--
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'], 'xlink':repo_dict['html_url']}
    # pygal会根据键’value‘相关联的数值来确定条形的高度,pygal会根据'xlink’相关联的url为每个条形转换为活跃的链接
    plot_dicts.append(plot_dict)
chart=pygal.Bar(x_label_rotation=45, show_legend=False)
chart.title='Most-Starred Python Projects on Github'
chart.x_labels=names
chart.add('starts', plot_dicts)
chart.render_to_file('images/python_repos_visual+.svg')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值