在本章中,我們將學習如何編寫一個獨立的程序,並對其獲取的數據進行可視化。這個程序將使用Web應用編程接口(API)自動請求網站的特定信息而不是整個網頁,再對這些信息進行可視化。由於這樣編寫的程序始終使用最新的數據來生成可視化,因此即便數據瞬息萬變,它呈現的信息也都是最新的。
17.1 使用Web API
Web API是網站的一部分,用於與使用非常具體的URL請求特定信息的程序交互。這種請求稱為API調用。請求的數據將易於處理的格式(如JSON或CSV)返回。
依賴於外部數據源的大多數應用程序都依賴於API調用,如集成社交媒體網站的應用程序。
17.1.1 Git和GitHub
本章的可視化將基於來自GitHub的信息,這是一個讓程序員能夠協作開發項目的網站。我們將使用GitHub的API來請求有關該網站中Python項目的信息,然后使用Pygal生成交互式可視化,以呈現這些項目的受歡迎程度。
GitHub(https://githu.com/)的名字源自Git,Git是一個分布式版本控制系統,讓程序員團隊能夠協作開發項目。Git幫助大家管理為項目所做的工作,避免一個人所做的修改影響其他人所做的修改。我們在項目中實現新功能時,Git將跟蹤我們對每個文件所做的修改。確定代碼可行后,我們提交所做的修改,而Git
將記錄項目最新的狀態。如果我們犯了錯,想撤銷所做的修改,可輕松地返回以前的任何可行狀態。GitHub上的項目都存儲在倉庫中,后者包含於項目相關聯的一切:代碼、項目參與者的信息、問題或bug報告等。
對於喜歡的項目,GitHub用戶可給它加星(star)以表示支持,用戶還可跟蹤他可能想使用的項目。在本章中,我們將編寫一個程序,它自動下載GitHub上星際最高的Python項目的信息,並對這些信息進行可視化。
17.1.2 使用API調用請求數據
GitHub的API讓我們能夠通過API調用來請求各種信息。要知道API調用是什么樣的,請在瀏覽器的地址欄中輸入如下地址並按回車鍵:
https://api.github.com/search/repositories?q=language:python&sort=stars
這個調用返回GitHub當前托管了多少個Python項目,還有有關最受歡迎的Python倉庫的信息。下面來仔細研究這個調用。第一部分(https://api.github.com/)將請求發送到GitHub網站中相應API調用的部分;接下來的一部分(search/repositories)讓API搜索GitHub上的所有倉庫。
repositories后面的問號指出我們要傳遞一個實參。q表示查詢,而等號讓我們能夠開始指定查詢(q=).通過使用language:python,我們指出只想獲取只要語言為Python的倉庫信息。最后一部分(%sort=stars)指定將項目按其獲得的星級進行排序。
下面顯示了相應的前幾行。從響應可知,該URL並不適合人工輸入。
從第二行輸出可知,編寫本書時,GitHub總共有713062個Python項目。‘incomplete_results"的值為False,據此我們知道請求是成功的。倘若GitHub無法全面處理該API,他返回的這個值將為True,接下來的列表中顯示了返回的'items',其中包含GitHub上最受歡迎的Python項目的詳細信息。
17.1.4 處理API響應
下面來編寫一個程序,它執行API調用並處理結果,找出GitHub上星級最高的Python項目:
python_repos.py --(1)
import requests
#執行API調用並存儲響應
url = 'https://api.github.com/search/repositories?q=language:python&sort=stars' --(2)
r = requests.get(url) --(3)
print("Status code:",r.status_code) --(4)
#將API響應存儲在一個變量中
response_dict = r.json() --(5)
#處理結果
print(response_dict.keys())
在(1)處,我們導入了模塊requests.在(2)處,我們存儲API調用的URL,然后使用requests來執行調用(見(3))。我們調用get()並將URL傳遞給它,在將
響應的對象存儲在變量r中。響應對象包含一個名為status_code的屬性,它讓我們知道請求是否成功了(狀態碼200表示請求成功)。在(4)處,我們打印status_code的屬性,核實調用是否成功了。
這個API返回JSON格式的信息,因此我們使用方法json()將這些信息轉換為一個Python字典(見(5))。我們將轉換得到的字典存儲在response_dict中。
最后,我們打印response_dict中的鍵。輸出如下:
Status code: 200
dict_keys(['total_count', 'items', 'incomplete_results'])
狀態碼為200,因此我們知道請求成功了。響應字典只包含三個鍵:’items','total_count','incomplete_results'.
17.1.5 處理響應字典
將API調用返回的信息存儲到字典后,就可以處理這個字典中的數據了。下面來生成一些概述這些信息的輸出。這是一種不錯的輸出方式,可確認收到了期望的信息,進而可以開始研究感興趣的信息:
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)
在(1)處,我們打印了與'total_count'相關聯的值,它指出了GitHub總共包含多少個Python倉庫。與'items'相關聯的值是一個列表,其中包含很多字典,而每個字典都包含有關一個Python倉庫的信息。在(2)處,我們將這個字典列表存儲在repo_dicts中。接下來,我們打印repo_dicts的長度,以獲悉我們獲得了多少個倉庫的信息。
為更深入地了解返回的有關每個倉庫的信息,我們提取了repo_dicts中的第一個字典,並將其存儲在repo_dict中。接下來,我們打印這個字典包含的鍵數,看看其中有多少信息。在(5)處,我們打印這個字典的所有鍵,看看其中包含那些信息。
輸出讓我們對實際包含的數據有了更清晰的認識: