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')