参考教材
<Python编程——从入门到实践> chapter17 web API
引言
什么是Web API?
如果我们想要获取一篇Blog,输入http://localhost:9000/blog/123 ,就可以看到id为123的Blog页面,但这个结果是HTML页面,它同时混合包含了Blog的数据和Blog的展示两个部分。对于用户来说,阅读起来没有问题,但是,如果机器读取,就很难从HTML中解析出Blog的数据。
如果一个URL返回的不是HTML,而是机器能直接解析的数据,这个URL就可以看成是一个Web API。比如,读取http://localhost:9000/api/blogs/123 ,如果能直接返回Blog的数据,那么机器就可以直接读取。
REST就是一种设计API的模式。最常用的数据格式是JSON。由于JSON能直接被JavaScript读取,所以,以JSON格式编写的REST风格的API具有简单、易读、易用的特点。
编写API有什么好处呢?由于API就是把Web App的功能全部封装了,所以,通过API操作数据,可以极大地把前端和后端的代码隔离,使得后端代码易于测试,前端代码编写更简单。
–摘自廖雪峰,《用Python编写web API的教程》
我们调用网站 Hacker News 的API https://hacker-news.firebaseio.com/v0/topstories.json
抓取Hacker News 上当前热门文章的ID,排名, 评论等信息,并将其可视化
由于这里没有什么太复杂的东西,需要解释的都在注释里了,直接贴代码好了
__author__ = 'Administrator'
#! /usr/bin/python <br> # -*- coding: utf8 -*-
import requests
from operator import itemgetter
import pygal
from pygal.style import LightColorizedStyle as LCS, LightenStyle as LS
#执行API调用并储存响应
url = 'https://hacker-news.firebaseio.com/v0/topstories.json'
r = requests.get(url)
print("Status Code : ",r.status_code)
# 处理有关每篇文章的信息
submisssion_ids = r.json()
submisssion_dicts = []
plot_dicts =[]
names = []
for submisssion_id in submisssion_ids[:10]:
#对每一篇文章都执行一个API调用
url = 'https://hacker-news.firebaseio.com/v0/item/'+str(submisssion_id)+'.json'
submisssion_r = requests.get(url)
# print("Status Code: ",submisssion_r.status_code)
response_dict = submisssion_r.json()
submisssion_dict = {
'label': response_dict['title'],
'xlink': response_dict['url'],
# 'link': "http://news.ycombinator.com/item?id="+str(submisssion_id)+"",
'value': response_dict.get('descendants',0),#指定的键存在时返回相应的值,不存在时返回0
}
names.append(submisssion_dict['label'])
submisssion_dicts.append(submisssion_dict)
submisssion_dicts = sorted(submisssion_dicts,key=itemgetter('value'),reverse=True)
my_comfig = pygal.Config()
my_comfig.title = 'Top 10 Stories From Hacker-News'
my_comfig.x_label_rotation = 45
my_comfig.width = 1000
my_style = LS('#883333',base_style=LCS)
chart = pygal.Bar(my_comfig,style=my_style)
chart.x_labels = names
chart.add('stories',submisssion_dicts)
chart.render_to_file('Top stories.svg')