《Python编程:从入门到实践》笔记。 本篇是Python数据处理的第三篇,本篇将使用Web应用程序接口自动请求网站的特定信息并可视化。
1. 前言
本将需要用到requests模块来请求网站数据。主要内容如下:
- 向GitHub请求项目数据,按星排序;
- 使用
pygal
可视化上述数据; - 调用Hacker News的API
2. GitHub repositories
获取GitHub中仓库的描述信息,并按星数排序:
# 代码: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) # 结果:Status code: 200Total repositories: 2563652Repositories returned: 30Keys: 72archive_urlarchivedassignees_urlblobs_url-- snip --
有些请求可能并不能成功,可能需要你的个人授权码:
headers = {"Authorization":"your perosonal token"}url = "https://api.github.com/search/repositories?q=language:python&sort=stars"r = requests.get(url, headers=headers)
大多数API都存在速率限制,即特定时间内可执行的请求数。对于GitHub的速率限制可以访问 访问,时间是“每分钟”。
3. 使用Pygal可视化仓库
使用一个参数配置类来定义图表的参数,并自定义图表中每个条形的描述信息,并给这些条形添加网址链接。
import requestsimport pygalfrom pygal.style import LightColorizedStyle as LCS, LightenStyle as LS-- snip --repo_dicts = response_dict["items"]names, plot_dicts = [], []for repo_dict in repo_dicts: names.append(repo_dict["name"]) plot_dict = { # 每个数据的值 "value": repo_dict["stargazers_count"], # 自定义每个数据的描述信息 # 原文中没有将其转换成str,报错;可能现在数据类型更改了? "label": str(repo_dict["description"]), # 为每个条添加网址链接 "xlink": repo_dict["html_url"], } plot_dicts.append(plot_dict)# 可视化my_style = LS("#333366", base_style=LCS)# 图表配置类my_config = pygal.Config()# x轴标签顺时针旋转45度my_config.x_label_rotation = 45# 不显示图例my_config.show_legend = Falsemy_config.title_font_size = 24my_config.label_font_size = 14# 主标签大小,y轴my_config.major_label_font_size = 18# x轴标签最长15个字符my_config.truncate_label = 15# 隐藏水平线my_config.show_y_guides = Falsemy_config.width = 1000chart = pygal.Bar(my_config, style=my_style)chart.title = "Most-Starred Python Projects on GitHub"chart.x_labels = nameschart.add("", plot_dicts)chart.render_to_file("python_repos.svg")
得到如下表格:
现在每一个数据都有自己的描述信息,并且点击它们还能跳到它们的项目网站。注意左侧y轴上的刻度,书中的刻度很密集,但同样的代码在这里不知道为什么很稀疏,所以这里没有体现出第34行代码的效果。
4. Hacker News API
Hacker News的API能让你访问该网站所有文章和评论的信息,且不用注册获取秘钥。下面通过一个API调用获取其上当前热门文章的ID,再查看前30篇文章(有可能访问不了,至于原因以及具体怎么做,你懂的):
import requestsfrom 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"])
以下是输出结果:
Status code: 200200200-- snip --Title: Wells Fargo Hit with $1B in FinesDiscussion link: http://news.ycombinator.com/item?id=16886328Comments: 358Title: Want airline food? Take AmtrakDiscussion link: http://news.ycombinator.com/item?id=16882231Comments: 160-- snip --
5. 小结
目前已经完成了两个项目,这本书还剩最后一个Django项目,从下一篇开始,也是用三篇文章来初步了解Django,制作一个简单的web应用。
迎大家关注我的微信公众号"代码港" & 个人网站 ~