第 17 章 使用API


    在本章中,我們將學習如何編寫一個獨立的程序,並對其獲取的數據進行可視化。這個程序將使用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)處,我們打印這個字典的所有鍵,看看其中包含那些信息。

    輸出讓我們對實際包含的數據有了更清晰的認識:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM