《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: 200
Total repositories: 2563652
Repositories returned: 30
Keys: 72
archive_url
archived
assignees_url
blobs_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的速率限制可以訪問 https://api.github.com/rate_limit 訪問,時間是“每分鐘”。
3. 使用Pygal視覺化倉庫
使用一個引數配置類來定義圖表的引數,並自定義圖表中每個條形的描述資訊,並給這些條形新增網址連結。
import requests
import pygal
from 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 = False
my_config.title_font_size = 24
my_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 = False
my_config.width = 1000
chart = pygal.Bar(my_config, style=my_style)
chart.title = "Most-Starred Python Projects on GitHub"
chart.x_labels = names
chart.add("", plot_dicts)
chart.render_to_file("python_repos.svg")
複製程式碼
得到如下表格:
現在每一個資料都有自己的描述資訊,並且點選它們還能跳到它們的專案網站。注意左側y軸上的刻度,書中的刻度很密集,但同樣的程式碼在這裡不知道為什麼很稀疏,所以這裡沒有體現出第34行程式碼的效果。
4. Hacker News API
Hacker News的API能讓你訪問該網站所有文章和評論的資訊,且不用註冊獲取祕鑰。下面通過一個API呼叫獲取其上當前熱門文章的ID,再檢視前30篇文章(有可能訪問不了,至於原因以及具體怎麼做,你懂的):
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"])
複製程式碼
以下是輸出結果:
Status code: 200
200
200
-- snip --
Title: Wells Fargo Hit with $1B in Fines
Discussion link: http://news.ycombinator.com/item?id=16886328
Comments: 358
Title: Want airline food? Take Amtrak
Discussion link: http://news.ycombinator.com/item?id=16882231
Comments: 160
-- snip --
複製程式碼
5. 小結
目前已經完成了兩個專案,這本書還剩最後一個Django專案,從下一篇開始,也是用三篇文章來初步瞭解Django,製作一個簡單的web應用。
迎大家關注我的微信公眾號"程式碼港" & 個人網站 www.vpointer.net ~