Python 使用API(Hacker News API)

在本章中,你将学习如何编写一个独立的程序,并对其获取的数据进行可视化。这个程序将使用Web应用编程接口 (API)自动请求网站的特定信息而不是整个网
页,再对这些信息进行可视化。由于这样编写的程序始终使用最新的数据来生成可视化,因此即便数据瞬息万变,它呈现的信息也都是最新的。

Hacker News API

为探索如何使用其他网站的API调用,我们来看看Hacker News(http://news.ycombinator.com/ )。在Hacker News网站,用户分享编程和技术方面的文章,并就这些文章展开积极的讨
论。Hacker News的API让你能够访问有关该网站所有文章和评论的信息,且不要求你通过注册获得密钥。

下面的调用返回本书编写时最热门的文章的信息:

https://hacker-news.firebaseio.com/v0/item/9884165.json

响应是一个字典,包含ID为9884165的文章的信息:

{
❶ 'url': 'http://www.bbc.co.uk/news/science-environment-33524589',
'type': 'story',
❷ 'title': 'New Horizons: Nasa spacecraft speeds past Pluto',
❸ 'descendants': 141,
'score': 230,
'time': 1436875181,
'text': '',
'by': 'nns',
'id': 9884165,
❹ 'kids': [9884723, 9885099, 9884789, 9885604, 9885844]
}

这个字典包含很多键,如’url’ (见❶)和’title’ (见❷)。与键’descendants’ 相关联的值是文章被评论的次数(见❸)。与键’kids’ 相关联的值包含对文章所做的
所有评论的ID(见❹)。每个评论自己也可能有kid,因此文章的后代(descendant)数量可能比其kid数量多。
下面来执行一个API调用,返回Hacker News上当前热门文章的ID,再查看每篇排名靠前的文章:

import requests
from operator import itemgetter
# 执行API调用并存储响应
❶ url = 'https://hacker-news.firebaseio.com/v0/topstories.json'
r = requests.get(url)
print("Status code:", r.status_code)
# 处理有关每篇文章的信息
❷ submission_ids = r.json()
❸ submission_dicts = []
for submission_id in submission_ids[:30]:
# 对于每篇文章,都执行一个API调用
❹ url = ('https://hacker-news.firebaseio.com/v0/item/' +
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)
❽ for submission_dict in submission_dicts:
print("\nTitle:", submission_dict['title'])
print("Discussion link:", submission_dict['link'])
print("Comments:", submission_dict['comments'])

首先,我们执行了一个API调用,并打印了响应的状态(见❶)。这个API调用返回一个列表,其中包含Hacker News上当前最热门的500篇文章的ID。接下来,我们将响应文本转
换为一个Python列表(见❷),并将其存储在submission_ids 中。我们将使用这些ID来创建一系列字典,其中每个字典都存储了一篇文章的信息。
在❸处,我们创建了一个名为submission_dicts 的空列表,用于存储前面所说的字典。接下来,我们遍历前30篇文章的ID。对于每篇文章,我们都执行一个API调用,其中
的URL包含submission_id 的当前值(见❹)。我们打印每次请求的状态,以便知道请求是否成功了。
在❺处,我们为当前处理的文章创建一个字典,并在其中存储文章的标题以及到其讨论页面的链接。在❻处,我们在这个字典中存储了评论数。如果文章还没有评论,响应字典
中将没有键’descendants’ 。不确定某个键是否包含在字典中时,可使用方法dict.get() ,它在指定的键存在时返回与之相关联的值,并在指定的键不存在时返回你指定
的值(这里是0)。最后,我们将submission_dict 附加到submission_dicts 末尾。

Hacker News上的文章是根据总体得分排名的,而总体得分取决于很多因素,其中包含被推荐的次数、评论数以及发表的时间。我们要根据评论数对字典列
表submission_dicts 进行排序,为此,使用了模块operator 中的函数itemgetter() (见❼)。我们向这个函数传递了键’comments’ ,因此它将从这个列表的每个
字典中提取与键’comments’ 相关联的值。这样,函数sorted() 将根据这种值对列表进行排序。我们将列表按降序排列,即评论最多的文章位于最前面。
对列表排序后,我们遍历这个列表(见❽),对于每篇热门文章,都打印其三项信息:标题、到讨论页面的链接以及文章现有的评论数:

Status code: 200
200
200
200
--snip--
Title: Firefox deactivates Flash by default
Discussion link: http://news.ycombinator.com/item?id=9883246
Comments: 231
Title: New Horizons: Nasa spacecraft speeds past Pluto
Discussion link: http://news.ycombinator.com/item?id=9884165
Comments: 142
Title: Iran Nuclear Deal Is Reached With World Powers
Discussion link: http://news.ycombinator.com/item?id=9884005
Comments: 141
Title: Match Group Buys PlentyOfFish for $575M
Discussion link: http://news.ycombinator.com/item?id=9884417
Comments: 75
Title: Our Nexus 4 devices are about to explode
Discussion link: http://news.ycombinator.com/item?id=9885625
Comments: 14
--snip--

使用任何API来访问和分析信息时,流程都与此类似。有了这些数据后,你就可以进行可视化,指出最近哪些文章引发了最激烈的讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值