在有關大數(shù)據分析PythonAPI的本教程中,我們將學習如何從遠程網站檢索數(shù)據以進行數(shù)據科學項目。像baidu,Twitter和Facebook之類的網站都通過其應用程序編程接口(API)向程序員提供某些數(shù)據。要使用API,你需要向遠程Web服務器發(fā)出請求,然后檢索所需的數(shù)據。
但是,為什么要使用API而不是可以下載的靜態(tài)數(shù)據集呢?API在以下情況下很有用:
a.數(shù)據變化很快。股票價格數(shù)據就是一個例子。重新生成數(shù)據集并每分鐘下載一次并沒有實際意義-這會占用大量帶寬,而且速度很慢。
b.您需要一小部分更大的數(shù)據。Reddit評論就是一個例子。如果您只想在Reddit上發(fā)表自己的評論該怎么辦?下載整個Reddit數(shù)據庫,然后僅過濾您自己的注釋并沒有多大意義。
c.涉及重復計算。Spotify的API可以告訴您音樂的流派。從理論上講,您可以創(chuàng)建自己的分類器,并使用它對音樂進行分類,但您將永遠不會擁有Spotify所擁有的數(shù)據。
在上述情況下,API是正確的解決方案。對于本數(shù)據科學教程,我們將查詢一個簡單的API,以檢索有關國際空間站(ISS)的數(shù)據。使用API可以節(jié)省我們自己進行所有計算的時間和精力。
大數(shù)據分析Python中的API請求
API托管在Web服務器上。當您www.google.com在瀏覽器的地址欄中鍵入內容時,您的計算機實際上是在向www.google.com服務器詢問網頁,然后該網頁返回到您的瀏覽器。
API的工作方式幾乎相同,除了您的程序要求數(shù)據而不是您的Web瀏覽器詢問網頁之外。這些數(shù)據通常以JSON格式返回(有關更多信息,請參閱有關使用JSON數(shù)據的教程)。
為了獲取數(shù)據,我們向Web服務器發(fā)出請求。然后,服務器將回復我們的數(shù)據。在大數(shù)據分析Python中,我們將使用請求庫來執(zhí)行此操作。在此大數(shù)據分析PythonAPI教程中,我們將為所有示例使用大數(shù)據分析Python3.4。
請求類型
有許多不同類型的請求。最常用的一個GET請求用于檢索數(shù)據。
我們可以使用一個簡單的GET請求從OpenNotifyAPI檢索信息。
OpenNotify具有多個API端點。端點是用于從API檢索不同數(shù)據的服務器路由。例如,/commentsRedditAPI上的端點可能會檢索有關注釋的信息,而/users端點可能會檢索有關用戶的數(shù)據。要訪問它們,您可以將端點添加到API的基本URL中。
我們將在OpenNotify上看到的第一個端點是iss-now.json端點。該端點獲取國際空間站的當前緯度和經度。如您所見,檢索此數(shù)據不適用于數(shù)據集,因為它涉及服務器上的一些計算,并且變化很快。
您可以在此處查看OpenNotify上所有端點的列表。
OpenNotifyAPI的基本網址是http://api.open-notify.org,因此我們將其添加到所有端點的開頭。
狀態(tài)碼
我們剛剛發(fā)出的請求的狀態(tài)碼為200。向Web服務器發(fā)出的每個請求都返回狀態(tài)代碼。狀態(tài)代碼指示有關請求發(fā)生的情況的信息。以下是與GET請求相關的一些代碼:
a)200-一切正常,結果已返回(如果有)
b)301—服務器正在將您重定向到其他端點。當公司切換域名或更改端點名稱時,可能會發(fā)生這種情況。
c)401-服務器認為您未通過身份驗證。當您沒有發(fā)送正確的憑據來訪問API時就會發(fā)生這種情況(我們將在以后的文章中討論身份驗證)。
d)400-服務器認為您提出了錯誤的請求。當您沒有正確發(fā)送數(shù)據時,可能會發(fā)生這種情況。
e)403—您嘗試訪問的資源被禁止—您沒有正確的權限查看它。
f)404-在服務器上找不到您嘗試訪問的資源。
現(xiàn)在http://api.open-notify.org/iss-pass,根據API文檔,向不存在的端點發(fā)出GET請求。
擊中正確的終點
iss-pass不是有效的端點,因此我們得到了一個404狀態(tài)碼作為相應。.json正如API文檔所述,我們忘記在最后添加。
現(xiàn)在,我們將向發(fā)出GET請求http://api.open-notify.org/iss-pass.json。
查詢參數(shù)
您將在上一個示例中看到,我們得到了一個400狀態(tài)碼,表示請求錯誤。如果您查看OpenNotifyAPI的文檔,我們會發(fā)現(xiàn)ISSPass端點需要兩個參數(shù)。
當ISS下次通過地球上的給定位置時,將返回ISSPass端點。為了對此進行計算,我們需要將位置的坐標傳遞給API。為此,我們傳遞了兩個參數(shù)-緯度和經度。
為此,我們可以在params請求中添加可選的關鍵字參數(shù)。在這種情況下,我們需要傳遞兩個參數(shù):
1)lat—我們想要的位置的緯度。
2)lon—我們想要的位置的經度。
我們可以使用這些參數(shù)制作字典,然后將它們傳遞給requests.get函數(shù)。
我們還可以通過將查詢參數(shù)添加到url中來直接做同樣的事情,如下所示:http://api.open-notify.org/iss-pass.json?lat=40.71&lon=-74。
將參數(shù)設置為字典幾乎總是可取的,因為requests它可以處理一些事情,例如正確設置查詢參數(shù)的格式。
我們將使用紐約市的坐標進行請求,然后查看得到的答復。
b'{n"message":"success",n"request":{n"altitude":100,n"datetime":1441417753,n"latitude":40.71,n"longitude":-74.0,n"passes":5n},n"response":[n{n"duration":330,n"risetime":1441445639n},n{n"duration":629,n"risetime":1441451226n},n{n"duration":606,n"risetime":1441457027n},n{n"duration":542,n"risetime":1441462894n},n{n"duration":565,n"risetime":1441468731n}n]n}'
b'{n"message":"success",n"request":{n"altitude":100,n"datetime":1441417753,n"latitude":40.71,n"longitude":-74.0,n"passes":5n},n"response":[n{n"duration":329,n"risetime":1441445639n},n{n"duration":629,n"risetime":1441451226n},n{n"duration":606,n"risetime":1441457027n},n{n"duration":542,n"risetime":1441462894n},n{n"duration":565,n"risetime":1441468731n}n]n}'
使用JSON數(shù)據
您可能已經注意到,響應的內容之前是astring(盡管它顯示為bytes對象,但是我們可以使用輕松地將內容轉換為字符串response.content.decode("utf-8"))。
字符串是我們將信息來回傳遞給API的方式,但是很難從字符串中獲取我們想要的信息。我們如何知道如何解碼返回的字符串并在大數(shù)據分析Python中使用它?我們如何altitude從字符串響應中找出ISS的含義?
幸運的是,有一種名為JavaScriptObjectNotation(JSON)的格式。JSON是一種將列表和字典之類的數(shù)據結構編碼為字符串的方法,以確保它們易于被機器讀取。JSON是將數(shù)據來回傳遞給API的主要格式,大多數(shù)API服務器將以JSON格式發(fā)送其響應。
json套件隨附大數(shù)據分析Python強大的JSON支持。該json軟件包是標準庫的一部分,因此我們無需安裝任何程序即可使用它。我們既可以將列表和字典轉換為JSON,也可以將字符串轉換為列表和字典。就我們的ISSPass數(shù)據而言,它是一個字典,編碼為JSON格式的字符串。
json庫有兩種主要方法:
1)dumps—接收一個大數(shù)據分析Python對象,并將其轉換為字符串。
2)loads—接收JSON字符串,并將其轉換為大數(shù)據分析Python對象。
從API請求獲取JSON
通過使用.json()響應上的方法,您可以將響應的內容作為大數(shù)據分析Python對象獲取。
{'response':[{'risetime':1441456672,'duration':369},{'risetime':1441462284,'duration':626},{'risetime':1441468104,'duration':581},{'risetime':1441474000,'duration':482},{'risetime':1441479853,'duration':509}],'message':'success','request':{'latitude':37.78,'passes':5,'longitude':-122.41,'altitude':100,'datetime':1441417753}}
內容類型
服務器不僅會在生成響應時發(fā)送狀態(tài)碼和數(shù)據。它還發(fā)送包含有關如何生成數(shù)據以及如何對其進行解碼的信息的元數(shù)據。這存儲在響應頭中。在大數(shù)據分析Python中,我們可以使用headers響應對象的屬性來訪問它。
標頭將顯示為字典。在標題中,content-type是目前最重要的鍵。它告訴我們響應的格式以及如何對其進行解碼。大數(shù)據分析PythonAPI入門教程https://www.aaa-cg.com.cn/data/2308.html對于OpenNotifyAPI,格式為JSON,這就是為什么我們可以json更早地使用包對其進行解碼的原因。
尋找太空中的人數(shù)
OpenNotify還有一個API端點astros.json。它告訴你當前有多少人在太空中。相應的格式可以在這里找到。
9
{'number':9,'people':[{'name':'GennadyPadalka','craft':'ISS'},{'name':'MikhailKornienko','craft':'ISS'},{'name':'ScottKelly','craft':'ISS'},{'name':'OlegKononenko','craft':'ISS'},{'name':'KimiyaYui','craft':'ISS'},{'name':'KjellLindgren','craft':'ISS'},{'name':'SergeyVolkov','craft':'ISS'},{'name':'AndreasMogensen','craft':'ISS'},{'name':'AidynAimbetov','craft':'ISS'}],'message':'success'}
大數(shù)據分析PythonAPI數(shù)據科學教程:后續(xù)步驟
現(xiàn)在,您已經完成了大數(shù)據分析PythonAPI教程,現(xiàn)在應該可以訪問簡單的API并發(fā)出get請求了。requests在我們的dataquestAPI和抓取課程中,還有其他幾種類型,您可以了解更多信息以及與API身份驗證一起使用。
建議的其他后續(xù)步驟是閱讀請求文檔,并使用RedditAPI。有一個名為PRAW的程序包,它使在大數(shù)據分析Python中使用RedditAPI更加容易,但是建議requests首先使用它來了解一切的工作原理。
https://www.toutiao.com/i6832146415016215043/