Python 和 API:讀取公共數據的成功組合

      網友投稿 926 2025-04-01

      目錄


      了解 API

      SOAP 與 REST 與 GraphQL

      請求和 API:天作之合

      使用 Python 調用您的第一個 API

      端點和資源

      請求和響應

      狀態代碼

      HTTP 標頭

      回復內容

      HTTP 方法

      查詢參數

      學習高級 API 概念

      驗證

      分頁

      限速

      使用 Python 使用 API:實際示例

      搜索和獲取熱門 GIF

      獲得每個國家/地區的 COVID-19 確診病例

      搜索 Google 圖書

      結論

      進一步閱讀

      知道如何使用 API 是一種神奇的技能,一旦掌握,就會打開一個充滿可能性的全新世界,而使用 Python 使用 API 是學習這種技能的好方法。

      您每天使用的許多應用程序和系統都連接到 API。從非常簡單和平凡的事情,比如早上查看天氣,到更容易上癮和耗時的操作,比如滾動你的 Instagram、TikTok 或 Twitter 提要,API 發揮著核心作用。

      在本教程中,您將學習:

      什么的API是

      如何使用Python 代碼使用 API

      最重要的API 相關概念是什么

      如何使用 Python讀取通過公共 API 提供的數據

      在本教程結束時,您將能夠使用 Python 來使用您遇到的大多數 API。如果您是一名開發人員,了解如何使用 Python 使用 API 將使您更加精通,尤其是在將您的工作與第三方應用程序集成時。

      注意:本教程的重點是如何使用 Python使用API,而不是如何構建它們。有關使用 Python 構建 API 的信息,請查看使用 Flask、Connexion 和 SQLAlchemy 的 Python REST API。

      您可以通過單擊下面的鏈接下載將在本教程中看到的示例的源代碼:

      了解 API

      API 代表應用程序編程接口。本質上,API 充當通信層,或者顧名思義,一個接口,它允許不同的系統相互通信,而無需準確了解彼此的作用。

      API 可以有多種形式或形狀。它們可以是操作系統 API,用于諸如打開相機和音頻以加入 Zoom 呼叫等操作。或者它們可以是網絡 API,用于以網絡為中心的操作,例如喜歡 Instagram 上的圖像或獲取最新的推文。

      無論類型如何,所有 API 的功能大致相同。您通常會請求信息或數據,API 會根據您的請求返回響應。例如,每次打開 Twitter 或向下滾動 Instagram 提要時,您基本上都是向該應用程序背后的 API 發出請求并獲得響應作為回報。這也稱為調用API。

      在本教程中,您將更多地關注跨網絡通信的高級 API,也稱為Web API。

      SOAP 與 REST 與 GraphQL

      盡管上面提到的一些示例是針對較新的平臺或應用程序,但 Web API 已經存在了很長時間。在 1990 年代末和 2000 年代初,兩種不同的設計模型成為公開數據的常態:

      Python 和 API:讀取公共數據的成功組合

      SOAP(簡單對象訪問協議)通常與企業世界相關聯,具有更嚴格的基于契約的用法,并且主要圍繞操作而設計。

      REST(具象狀態傳輸)通常用于公共 API,是從 Web 獲取數據的理想選擇。它比 SOAP 輕得多,也更接近 HTTP 規范。

      如今,鎮上有一個新孩子:GraphQL。GraphQL 由 Facebook 創建,是一種非常靈活的 API 查詢語言,客戶端可以準確地決定他們想要從服務器獲取什么,而不是服務器決定發送什么。

      如果您想更多地了解這三種設計模型之間的差異,那么這里有一些很好的資源:

      什么是肥皂?

      什么是休息?

      API 101:SOAP 與 REST

      GraphQL 簡介

      比較 API 架構風格:SOAP vs REST vs GraphQL vs RPC

      盡管 GraphQL 正在興起并被越來越大的公司采用,包括GitHub和Shopify,但事實是大多數公共 API 仍然是 REST API。因此,就本教程而言,您將僅了解 REST API 以及如何使用 Python 使用它們。

      requests?和 API:天作之合

      使用 Python 使用 API 時,您只需要一個庫:requests.?有了它,您應該能夠執行使用任何公共 API 所需的大部分(如果不是全部)操作。

      您可以requests通過在控制臺中運行以下命令來安裝:

      $ python -m pip install requests

      要遵循本教程中的代碼示例,請確保您使用的是 Python 3.8.1 和requests2.24.0 或更高版本。

      使用 Python 調用您的第一個 API

      話不多說——是時候進行您的第一個 API 調用了!對于第一個示例,您將調用一個流行的 API 來生成隨機用戶數據。

      在整個教程中,您將看到警報塊中引入的新 API,如下所示。這是一種方便的方式,您可以在之后滾動瀏覽并快速找到您了解的所有新 API。

      Random User Generator API:這是一個生成隨機用戶數據的好工具。您可以使用它來生成任意數量的隨機用戶和相關數據,還可以指定性別、國籍和許多其他過濾器,這些過濾器在測試應用程序或在這種情況下是 API 時非常有用。

      開始使用 Random User Generator API 時,您唯一需要知道的是使用哪個 URL 調用它。對于此示例,要使用的 URL 是https://randomuser.me/api/,這是您可以進行的最小的 API 調用:

      >>>

      >>> import requests >>> requests.get("https://randomuser.me/api/")

      在這個小例子,你導入的requests庫,然后從URL中隨機用戶生成器API獲取(或獲得)的數據。但是您實際上看不到任何返回的數據。你得到的是 a?Response [200],在 API 術語中意味著一切正常。

      如果要查看實際數據,則可以.text從返回的Response對象中使用:

      >>>

      >>> import requests >>> response = requests.get("https://randomuser.me/api/") >>> response.text '{"results":[{"gender":"female", "name":{"title":"Ms","first":"Isobel","last":"Wang"}...'

      就是這樣!這就是 API 消費的基礎知識。您設法使用 Python 和requests庫從隨機用戶生成器 API 中獲取了您的第一個隨機用戶。

      端點和資源

      正如您在上面看到的,使用 API 需要知道的第一件事是 API URL,通常稱為基本 URL。基本 URL 結構與您用于瀏覽 Google、YouTube 或 Facebook 的 URL 沒有什么不同,盡管它通常包含單詞api。這不是強制性的,只是更多的經驗法則。

      例如,以下是一些知名 API 播放器的基本 URL:

      https://api.twitter.com

      https://api.github.com

      https://api.stripe.com

      如您所見,以上所有內容均以https://api并包括剩余的官方域,例如.twitter.com或.github.com。API 基本 URL 的外觀沒有特定的標準,但它模仿這種結構是很常見的。

      如果您嘗試打開上述任何鏈接,您會注意到它們中的大多數都會返回錯誤或要求提供憑據。這是因為 API 有時需要身份驗證步驟才能使用它們。您將了解更多有關這一點以后的教程。

      TheDogAPI:這個 API 很有趣,但也是一個很好的例子,它是一個很好的 API 和很好的文檔。有了它,你可以獲取不同的狗品種和一些圖像,但如果你注冊,你也可以為你最喜歡的狗投票。

      接下來,使用剛剛引入的TheDogAPI,您將嘗試發出一個基本請求,以查看它與您在上面嘗試過的 Random User Generator API 有何不同:

      >>>

      >>> import requests >>> response = requests.get("https://api.thedogapi.com/") >>> response.text '{"message":"The Dog API"}'

      在這種情況下,當調用基本 URL 時,您會收到一條通用消息,內容為The Dog API。這是因為您正在調用基本 URL,它通常用于有關 API 的非常基本的信息,而不是真實數據。

      單獨調用基本 URL 并不是很有趣,但這就是端點派上用場的地方。一個端點是指定哪些URL的一部分資源,你想獲取。有據可查的 API 通常包含API 參考,這對于了解 API 的確切端點和資源以及如何使用它們非常有用。

      您可以查看官方文檔以了解有關如何使用 TheDogAPI 以及可用端點的更多信息。在那里,您會找到一個/breeds端點,您可以使用它來獲取所有可用的品種資源或對象。

      如果向下滾動,您將找到發送測試請求部分,您將在其中看到如下所示的表單:

      這是您將在許多 API 文檔中看到的內容:一種直接從文檔頁面快速測試 API 的方法。在這種情況下,您可以單擊發送以快速獲取調用該端點的結果。等等,您只需調用 API,而無需為其編寫任何代碼。

      現在,使用品種端點和您已經擁有的一些 API 知識在本地嘗試代碼:

      >>>

      >>> response = requests.get("https://api.thedogapi.com/v1/breeds") >>> response.text '[{"weight":{"imperial":"6 - 13","metric":"3 - 6"},"height": ...}]'

      好了,您使用狗 API 列出了您的第一個品種!

      如果您是愛貓人士,請不要擔心。還有一個 API 供您使用,它具有相同的端點但具有不同的基本 URL:

      >>>

      >>> response = requests.get("https://api.thecatapi.com/v1/breeds") >>> response.text '[{..."id":"abys","name":"Abyssinian"}]'

      我敢打賭,您已經在考慮使用這些 API 來制作一些可愛的副項目的不同方式,這就是 API 的偉大之處。一旦您開始使用它們,沒有什么能阻止您將愛好或激情變成有趣的小項目。

      在你向前走,有一件事你需要了解端點之間的差別http://和https://。簡而言之,HTTPS 是 HTTP 的加密版本,使客戶端和服務器之間的所有流量更加安全。在使用公共 API 時,您絕對應該避免向http://端點發送任何私人或敏感信息,并僅使用那些提供安全https://基本 URL 的API?。

      有關在線瀏覽時堅持使用 HTTPS 的重要性的更多信息,請查看使用 Python 探索 HTTPS。

      在下一部分中,您將更深入地了解 API 調用的主要組件。

      請求和響應

      正如您在上面簡要閱讀的那樣,客戶端(在本例中是您的 Python 控制臺)和 API 之間的所有交互都分為請求和響應:

      請求包含有關您的 API 請求調用的相關數據,例如基本 URL、端點、使用的方法、標頭等。

      響應包含服務器返回的相關數據,包括數據或內容、狀態代碼和標頭。

      再次使用 TheDogAPI,您可以深入了解Request和Response對象內部的確切內容:

      >>>

      >>> response = requests.get("https://api.thedogapi.com/v1/breeds") >>> response >>> response.request >>> request = response.request >>> request.url 'https://api.thedogapi.com/v1/breeds' >>> request.path_url '/v1/breeds' >>> request.method 'GET' >>> request.headers {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'} >>> response >>> response.text '[{"weight":{"imperial":"6 - 13","metric":"3 - 6"}, "height":{"imperial":"9 - 11.5","metric":"23 - 29"},"id":1, "name":"Affenpinscher", ...}]' >>> response.status_code 200 >>> response.headers {'Cache-Control': 'post-check=0, pre-check=0', 'Content-Encoding': 'gzip', 'Content-Type': 'application/json; charset=utf-8', 'Date': 'Sat, 25 Jul 2020 17:23:53 GMT'...}

      上面的示例向您展示了可用于Request和Response對象的一些最重要的屬性。

      您將在本教程中了解有關其中一些屬性的更多信息,但如果您想進一步挖掘,那么您可以查看 Mozilla 的HTTP 消息文檔,以獲得對每個屬性的更深入解釋。

      狀態代碼

      狀態代碼是在任何 API 響應中尋找的最重要的信息之一。它們會告訴您您的請求是否成功、是否缺少數據、是否缺少憑據等等。

      隨著時間的推移,您會在沒有幫助的情況下識別不同的狀態代碼。但就目前而言,這里列出了您會發現的一些最常見的狀態代碼:

      您200 OK之前在執行的示例中看到過,您甚至可以404 Not Found通過瀏覽網頁來識別。

      有趣的事實:公司傾向于將404錯誤頁面用于私人笑話或純粹的樂趣,如下面的示例:

      Mantra Labs

      Gymbox

      Pixar

      Slack

      但是,在 API 世界中,開發人員對這種樂趣的響應空間有限。但它們在其他地方彌補了這一點,比如 HTTP 標頭。您很快就會看到一些示例!

      您可以使用.status_code和來檢查響應的狀態.reason。該requests庫還在Response對象的表示中打印狀態代碼:

      >>>

      >>> response = requests.get("https://api.thedogapi.com/v1/breeds") >>> response >>> response.status_code 200 >>> response.reason 'OK'

      上面的請求返回200,所以你可以認為它是一個成功的請求。但是現在看看當您在端點中包含拼寫錯誤時觸發的失敗請求/breedz:

      >>>

      >>> response = requests.get("https://api.thedogapi.com/v1/breedz") >>> response >>> response.status_code 404 >>> response.reason 'Not Found'

      如您所見,/breedz端點不存在,因此 API 返回一個404 Not Found狀態代碼。

      您可以使用這些狀態代碼快速查看您的請求是否需要更改,或者您是否應該再次檢查文檔以查找任何拼寫錯誤或缺失的部分。

      HTTP 標頭

      HTTP 標頭用于定義一些管理請求和響應的參數:

      在檢查請求或響應時,您還可以找到許多其他標頭。如果您對每個的具體用途感到好奇,請查看Mozilla 的擴展列表。

      要檢查響應的標頭,您可以使用response.headers:

      >>>

      >>> response = requests.get("https://api.thedogapi.com/v1/breeds/1") >>> response.headers {'Content-Encoding': 'gzip', 'Content-Type': 'application/json; charset=utf-8', 'Date': 'Sat, 25 Jul 2020 19:52:07 GMT'...}

      要對請求標頭執行相同操作,您可以使用response.request.headers因為request是Response對象的屬性:

      >>>

      >>> response = requests.get("https://api.thedogapi.com/v1/breeds/1") >>> response.request.headers {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}

      在這種情況下,您在發出請求時沒有定義任何特定的標頭,因此會返回默認標頭。

      您在使用 API 時可能會遇到的另一個標準是使用自定義標頭。這些通常以 開頭X-,但不是必需的。API 開發人員通常使用自定義標頭向客戶端發送或請求其他自定義信息。

      有趣的事實:一些公司不遺余力地變得有趣和創新,以一種他們不應該使用的方式使用 HTTP 標頭,例如征求工作申請。

      您可以使用字典來定義標頭,并且可以使用 的headers參數將它們與您的請求一起發送.get()。

      例如,假設您想向 API 服務器發送一些請求 ID,并且您知道可以使用X-Request-Id:

      >>>

      >>> headers = {"X-Request-Id": ""} >>> response = requests.get("https://example.org", headers=headers) >>> response.request.headers {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'X-Request-Id': ''}

      如果你翻閱request.headers字典,你會X-Request-Id在最后找到一些其他的標頭,這些標頭是任何 API 請求的默認標頭。

      響應可能有許多有用的標頭,但最重要的標頭之一是Content-Type,它定義了響應中返回的內容類型。

      現在,大多數 API 使用JSON作為默認內容類型,但您可能需要使用返回 XML 或其他媒體類型(例如圖像或視頻)的 API。在這種情況下,內容類型會有所不同。

      如果您回顧之前使用 TheDogAPI 的示例之一并嘗試檢查Content-Type標頭,那么您會注意到它是如何定義為application/json:

      >>>

      >>> response = requests.get("https://api.thedogapi.com/v1/breeds/1") >>> response.headers.get("Content-Type") 'application/json; charset=utf-8'

      除了特定類型的內容(在本例中application/json)之外,標頭還可能返回響應內容的指定編碼。

      PlaceGOAT API:這是一個非常愚蠢的 API,它返回不同大小的山羊圖像,您可以將其用作網站中的占位符圖像。

      例如,如果您嘗試從PlaceGOAT API獲取山羊的圖像,那么您會注意到內容類型不再是application/json,而是被定義為image/jpeg:

      >>>

      >>> response = requests.get("http://placegoat.com/200/200") >>> response >>> response.headers.get("Content-Type") 'image/jpeg'

      在這種情況下,Content-Type標題聲明返回的內容是 JPEG 圖像。您將在下一節中了解如何查看此內容。

      該Content-Type頭部是非常重要的,你要知道如何處理的響應和如何處理它的內容。還有數百種其他可接受的內容類型,包括音頻、視頻、字體等。

      回復內容

      正如您剛剛了解到的,您在 API 響應中找到的內容類型將根據Content-Type標頭而有所不同。為了根據不同的Content-Type標頭正確讀取響應內容,該requests包附帶了幾個不同的Response屬性,您可以使用它們來操作響應數據:

      .text以Unicode格式返回響應內容。

      .content以字節為單位返回響應內容。

      您已經使用了.text上面的屬性。但是對于某些特定類型的數據,例如圖像和其他非文本數據,使用.content通常是更好的方法,即使它返回的結果與 非常相似.text:

      >>>

      >>> response = requests.get("https://api.thedogapi.com/v1/breeds/1") >>> response.headers.get("Content-Type") 'application/json; charset=utf-8' >>> response.content b'{"weight":{"imperial":"6 - 13","metric":"3 - 6"}...'

      如您所見,.content與之前使用的.text.

      但是,通過查看響應的Content-Type標頭,您可以看到內容是application/json;JSON 對象。對于此類內容,該requests庫包含一種特定.json()方法,您可以使用該方法將 API 字節響應立即轉換為Python 數據結構:

      >>>

      >>> response = requests.get("https://api.thedogapi.com/v1/breeds/1") >>> response.headers.get("Content-Type") 'application/json; charset=utf-8' >>> response.json() {'weight': {'imperial': '6 - 13', 'metric': '3 - 6'}, 'height': {'imperial': '9 - 11.5', 'metric': '23 - 29'} ...} >>> response.json()["name"] 'Affenpinscher'

      如您所見,在執行 之后response.json(),您將獲得一個字典,您可以像使用 Python 中的任何其他字典一樣使用它。

      現在,回顧最近使用 PlaceGOAT API 運行的示例,嘗試獲取相同的山羊圖像并查看其內容:

      >>>

      >>> response = requests.get("http://placegoat.com/200/200") >>> response >>> response.headers.get("Content-Type") 'image/jpeg' >>> response.content b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00H\...'

      在這種情況下,因為您請求的是圖像,.content所以不是很有幫助。事實上,這幾乎是不可能理解的。但是,您知道這是一個 JPEG 圖像,因此您可以嘗試將其存儲到一個文件中,看看會發生什么:

      >>>

      >>> response = requests.get("http://placegoat.com/200/200") >>> response >>> response.headers.get("Content-Type") 'image/jpeg' >>> file = open("goat.jpeg", "wb") >>> file.write(response.content) >>> file.close()

      現在,如果您打開正在工作的文件夾,則會找到一個goat.jpeg文件,該文件是您剛剛使用 API 獲取的山羊的隨機圖像。是不是很神奇?

      HTTP 方法

      調用 API 時,有幾種不同的方法,也稱為動詞,可用于指定要執行的操作。例如,如果你想獲取一些數據,你會使用方法GET,如果你想創建一些數據,那么你會使用方法POST。

      當純粹使用 API 消費數據時,您通常會堅持使用GET請求,但這里列出了最常見的方法及其典型用例:

      這四種方法通常被稱作CRUD操作,因為他們讓你??reate,[R?EAD,ü?PDATE和d?elete資源。

      注意:還有一個額外的PATCH方法也與 CRUD 操作相關聯,但它比上面的四個方法稍微少一些。它用于進行部分修改,而不是使用 完全替換資源PUT。

      您可以閱讀更多關于兩者之間PUTPATCH的差異并了解他們不同需求的信息。

      如果您對其余的 HTTP 方法感到好奇,或者您只是想了解更多關于已經提到的方法,那么請查看Mozilla 的文檔。

      到目前為止,您只用于.get()獲取數據,但您也可以將requests包用于所有其他 HTTP 方法:

      >>>

      >>> requests.post("https://api.thedogapi.com/v1/breeds/1") >>> requests.get("https://api.thedogapi.com/v1/breeds/1") >>> requests.put("https://api.thedogapi.com/v1/breeds/1") >>> requests.delete("https://api.thedogapi.com/v1/breeds/1")

      如果您在控制臺上嘗試這些,那么您會注意到它們中的大多數都會返回405 Method Not Allowed?狀態代碼。這是因為不是所有的終端將允許POST,PUT或DELETE方法。特別是當您使用公共 API 讀取數據時,您會發現大多數 API 只允許GET請求,因為您不允許創建或更改現有數據。

      查詢參數

      有時,當您調用 API 時,您會獲得大量不需要或不需要的數據。例如,在調用 TheDogAPI 的/breeds端點時,您會獲得有關給定品種的大量信息。但在某些情況下,您可能只想提取有關給定品種的某些信息。這就是查詢參數的用武之地!

      在線瀏覽時,您可能已經看到或使用過查詢參數。例如,在觀看 YouTube 視頻時,您有一個類似https://www.youtube.com/watch?v=aL5GK2LVMWI.?將v=在URL就是你所說的查詢參數。它通常在基本 URL 和端點之后。

      要將查詢參數添加到給定的 URL,您必須?在第一個查詢參數之前添加一個問號 (?)。如果你想在你的請求中有多個查詢參數,那么你可以用 & 號 (?&)將它們分開。

      同樣的YouTube網址上面有多個查詢參數是這樣的:https://www.youtube.com/watch?v=aL5GK2LVMWI&t=75。

      在 API 世界中,查詢參數用作過濾器,您可以隨 API 請求一起發送,以進一步縮小響應范圍。例如,回到 Random User Generator API,您知道如何生成隨機用戶:

      >>>

      >>> requests.get("https://randomuser.me/api/").json() {'results': [{'gender': 'male', 'name': {'title': 'Mr', 'first': 'Silvijn', 'last': 'Van Bekkum'}, 'location': {'street': {'number': 2480, 'name': 'Hooijengastrjitte'}, 'city': 'Terherne', 'state': 'Drenthe', 'country': 'Netherlands', 'postcode': 59904...}

      但是,假設您特別想只生成隨機的女性用戶。根據文檔,您可以使用查詢參數gender=:

      >>>

      >>> requests.get("https://randomuser.me/api/?gender=female").json() {'results': [{'gender': 'female', 'name': {'title': 'Mrs', 'first': 'Marjoleine', 'last': 'Van Huffelen'}, 'location': {'street': {'number': 8993, 'name': 'De Teebus'}, 'city': 'West-Terschelling', 'state': 'Limburg', 'country': 'Netherlands', 'postcode': 24241...}

      那太棒了!現在假設您只想生成來自德國的女性用戶。再次查看文檔,您會找到關于nationality的部分,您可以使用查詢參數nat=:

      >>>

      >>> requests.get("https://randomuser.me/api/?gender=female&nat=de").json() {'results': [{'gender': 'female', 'name': {'title': 'Ms', 'first': 'Marita', 'last': 'Hertwig'}, 'location': {'street': {'number': 1430, 'name': 'Waldstra?e'}, 'city': 'Velden', 'state': 'Rheinland-Pfalz', 'country': 'Germany', 'postcode': 30737...}

      使用查詢參數,您可以開始從 API 獲取更具體的數據,從而使整個體驗更加符合您的需求。

      為了避免一遍又一遍地重建 URL,您可以使用該params屬性發送所有查詢參數的字典以附加到 URL:

      >>>

      >>> query_params = {"gender": "female", "nat": "de"} >>> requests.get("https://randomuser.me/api/", params=query_params).json() {'results': [{'gender': 'female', 'name': {'title': 'Ms', 'first': 'Janet', 'last': 'Weyer'}, 'location': {'street': {'number': 2582, 'name': 'Meisenweg'}, 'city': 'Garding', 'state': 'Mecklenburg-Vorpommern', 'country': 'Germany', 'postcode': 56953...}

      您可以將上述內容應用于您喜歡的任何其他 API。如果您返回 TheDogAPI,文檔中有一種方法可以讓您過濾品種端點以僅返回與特定名稱匹配的品種。例如,如果您想查找拉布拉多犬品種,那么您可以使用查詢參數來實現q:

      >>>

      >>> query_params = {"q": "labradoodle"} >>> endpoint = "https://api.thedogapi.com/v1/breeds/search" >>> requests.get(endpoint, params=query_params).json() [{'weight': {'imperial': '45 - 100', 'metric': '20 - 45'}, 'height': {'imperial': '14 - 24', 'metric': '36 - 61'}, 'id': 148, 'name': 'Labradoodle', 'breed_group': 'Mixed'...}]

      你有它!通過發送q帶有 value的查詢參數labradoodle,您可以過濾與該特定值匹配的所有品種。

      提示:當您重用相同的端點時,最佳做法是將其定義為代碼頂部的變量。當您反復與 API 交互時,這將使您的生活更輕松。

      在查詢參數的幫助下,您可以進一步縮小請求的范圍并準確指定您要查找的內容。您可以在網上找到的大多數 API 都有某種查詢參數,您可以使用它們來過濾數據。請記住查看文檔和 API 參考以找到它們。

      學習高級 API 概念

      現在您已經很好地了解了使用 Python 使用 API 的基礎知識,還有一些更高級的主題值得探討,即使是簡短的,例如身份驗證、分頁和速率限制。

      驗證

      API 身份驗證可能是本教程中涵蓋的最復雜的主題。盡管許多公共 API 是免費且完全公開的,但在某種形式的身份驗證背后還有更多的 API 可用。有許多需要身份驗證的 API,但這里有一些很好的例子:

      GitHub API

      推特API

      Instagram API

      身份驗證方法的范圍從簡單明了(例如使用 API 密鑰或基本身份驗證的方法)到更復雜和更安全的技術(例如 OAuth)。

      通常,在沒有憑據或使用錯誤憑據的情況下調用 API 將返回401 Unauthorized或403 Forbidden狀態代碼。

      最常見的身份驗證級別是API 密鑰。這些密鑰用于將您識別為 API 用戶或客戶并跟蹤您對 API 的使用。API 密鑰通常作為請求標頭或查詢參數發送。

      NASA API:最酷的公開 API 集合之一是由NASA提供的 API?。您可以找到 API 來獲取當天的天文圖片或地球多色成像相機 (EPIC)拍攝的圖片等。

      對于此示例,您將使用 NASA 的Mars Rover Photo API,并獲取 2020 年 7 月 1 日拍攝的照片。出于測試目的,您可以使用DEMO_KEYNASA 默認提供的API 密鑰。否則,您可以通過轉到 NASA 的主 API 頁面并單擊開始使用來快速生成您自己的API。

      您可以通過附加api_key=查詢參數將 API 密鑰添加到您的請求中:

      >>>

      >>> endpoint = "https://api.nasa.gov/mars-photos/api/v1/rovers/curiosity/photos" >>> # Replace DEMO_KEY below with your own key if you generated one. >>> api_key = "DEMO_KEY" >>> query_params = {"api_key": api_key, "earth_date": "2020-07-01"} >>> response = requests.get(endpoint, params=query_params) >>> response

      到現在為止還挺好。您設法向 NASA 的 API 發出經過身份驗證的請求并獲得200 OK響應。

      現在看看這個Response對象并嘗試從中提取一些圖片:

      >>>

      >>> response.json() {'photos': [{'id': 754118, 'sol': 2809, 'camera': {'id': 20, 'name': 'FHAZ', 'rover_id': 5, 'full_name': 'Front Hazard Avoidance Camera'}, 'img_src': 'https://mars.nasa.gov/msl-raw-images/...JPG', 'earth_date': '2020-07-01', 'rover': {'id': 5, 'name': 'Curiosity', 'landing_date': '2012-08-06', 'launch_date': '2011-11-26', 'status': 'active'}}, ... } >>> photos = response.json()["photos"] >>> print(f"Found {len(photos)} photos") Found 12 photos >>> photos[4]["img_src"] 'https://mars.nasa.gov/msl-raw-images/proj/msl/redops/ods/surface/sol/02809/opgs/edr/rcam/RRB_646869036EDR_F0810628RHAZ00337M_.JPG'

      使用.json()將響應轉換為 Python 字典,然后photos從響應中獲取字段,您可以遍歷所有Photo對象,甚至獲取特定照片的圖像 URL。如果您在瀏覽器中打開該網址,然后你會看到火星由一個采取了以下圖片火星探測器:

      對于此示例,您從響應字典 (?) 中選擇了一個特定的earth_date(?2020-07-01),然后選擇了一張特定的照片4。在繼續之前,嘗試更改日期或從不同的相機獲取照片,看看它如何改變最終結果。

      API 身份驗證中另一個非常常見的標準是OAuth。在本教程中,您將只學習 OAuth 的基本知識,因為這是一個非常廣泛的主題。

      即使您不知道它是 OAuth 的一部分,您也可能已經多次看到并使用過 OAuth 流程。每當應用程序或平臺具有登錄方式或繼續方式選項時,這就是 OAuth 流程的起點:

      以下是單擊繼續使用 Facebook會發生的情況的分步細分:

      Spotify 應用程序將要求 Facebook API 啟動身份驗證流程。為此,Spotify 應用程序將發送其應用程序 ID (?client_id) 和 URL (?redirect_uri) 以在成功或錯誤后重定向用戶。

      您將被重定向到 Facebook 網站,并要求您使用您的憑據登錄。Spotify 應用程序不會看到或無法訪問這些憑據。這是 OAuth 最重要的好處。

      Facebook 將向您顯示 Spotify 應用程序從您的個人資料中請求的所有數據,并要求您接受或拒絕共享該數據。

      如果您接受讓 Spotify 訪問您的數據,那么您將被重定向回已登錄的 Spotify 應用程序。

      在執行第 4 步時,Facebook 將向 Spotify 提供一個特殊憑據 (?access_token),可以重復使用它來獲取您的信息。這個特定的 Facebook 登錄令牌的有效期為 60 天,但其他應用程序可能有不同的有效期。如果您好奇,那么 Facebook 有一個設置頁面,您可以查看哪些應用程序已獲得您的 Facebook 訪問令牌。

      現在,從更技術的角度來看,以下是您在使用 OAuth 使用 API 時需要了解的事項:

      您需要創建一個具有 ID(app_id或client_id)和機密(app_secret或client_secret)的應用程序。

      您需要有一個重定向 URL (?redirect_uri),API 將使用它向您發送信息。

      您將獲得一個作為身份驗證結果的代碼,您需要用它來交換訪問令牌。

      上面有一些變體,但一般來說,大多數 OAuth 流程都有與這些類似的步驟。

      提示:當您只是進行測試并且需要某種重定向 URL 來獲取 . 時code,您可以使用名為httpbin的服務。

      更具體地說,您可以將其https://httpbin.org/anything用作重定向 URL,因為它只會輸出它作為輸入獲取的任何內容。您可以通過導航到該 URL 來自行測試。

      接下來,您將深入研究使用 GitHub API 的示例!

      正如您在上面看到的,您需要做的第一件事是創建一個應用程序。您可以參考GitHub 文檔中關于如何執行此操作的詳細分步說明。唯一要記住的是將https://httpbin.org/anything上面提到的URL 用于授權回調 URL字段。

      GitHub API:您可以將GitHub API用于許多不同的用例,例如獲取您所屬的存儲庫列表、獲取您擁有的關注者列表等等。

      創建應用程序后,將 和Client_ID以及Client_Secret您選擇的重定向 URL復制并粘貼到名為 的 Python 文件中github.py:

      import requests # REPLACE the following variables with your Client ID and Client Secret CLIENT_ID = "" CLIENT_SECRET = "" # REPLACE the following variable with what you added in the # "Authorization callback URL" field REDIRECT_URI = ""

      現在您已準備好所有重要變量,您需要能夠創建一個鏈接以將用戶重定向到他們的 GitHub 帳戶,如GitHub 文檔中所述:

      def create_oauth_link(): params = { "client_id": CLIENT_ID, "redirect_uri": REDIRECT_URI, "scope": "user", "response_type": "code", } endpoint = "https://github.com/login/oauth/authorize" response = requests.get(endpoint, params=params) url = response.url return url

      在這段代碼中,您首先定義 API 期望的必需參數,然后使用requests包和.get().

      當您向/login/oauth/authorize端點發出請求時,API 會自動將您重定向到 GitHub 網站。在這種情況下,您希望url從響應中獲取參數。此參數包含 GitHub 將您重定向到的確切 URL。

      授權流程的下一步是將您獲得的代碼交換為訪問令牌。同樣,按照GitHub 文檔中的步驟,您可以為它創建一個方法:

      def exchange_code_for_access_token(code=None): params = { "client_id": CLIENT_ID, "client_secret": CLIENT_SECRET, "redirect_uri": REDIRECT_URI, "code": code, } headers = {"Accept": "application/json"} endpoint = "https://github.com/login/oauth/access_token" response = requests.post(endpoint, params=params, headers=headers).json() return response["access_token"]

      在這里,您POST請求交換訪問令牌的代碼。在此請求中,您必須發送您的CLIENT_SECRETandcode以便 GitHub 可以驗證此特定代碼最初是由您的應用程序生成的。只有這樣,GitHub API 才會生成有效的訪問令牌并將其返回給您。

      現在您可以將以下內容添加到您的文件中并嘗試運行它:

      link = create_oauth_link() print(f"Follow the link to start the authentication with GitHub: {link}") code = input("GitHub code: ") access_token = exchange_code_for_access_token(code) print(f"Exchanged code {code} with access token: {access_token}")

      如果一切按計劃進行,那么您應該獲得一個有效的訪問令牌作為獎勵,您可以使用它來調用 GitHub API,模擬經過身份驗證的用戶。

      現在嘗試添加以下代碼以使用User API獲取您的用戶配置文件并打印您的姓名、用戶名和私有存儲庫的數量:

      def print_user_info(access_token=None): headers = {"Authorization": f"token {access_token}"} endpoint = "https://api.github.com/user" response = requests.get(endpoint, headers=headers).json() name = response["name"] username = response["login"] private_repos_count = response["total_private_repos"] print( f"{name} ({username}) | private repositories: {private_repos_count}" )

      現在您擁有有效的訪問令牌,您需要使用Authorization標頭在所有 API 請求中發送它。對您的請求的響應將是一個包含所有用戶信息的 Python 字典。從該字典,你想獲取的字段name,login以及total_private_repos。您還可以打印response變量以查看其他可用字段。

      好吧,應該是這樣!剩下唯一要做的就是把它們放在一起并嘗試一下:

      1import requests 2 3# REPLACE the following variables with your Client ID and Client Secret 4CLIENT_ID = "" 5CLIENT_SECRET = "" 6 7# REPLACE the following variable with what you added in 8# the "Authorization callback URL" field 9REDIRECT_URI = "" 10 11def create_oauth_link(): 12 params = { 13 "client_id": CLIENT_ID, 14 "redirect_uri": REDIRECT_URI, 15 "scope": "user", 16 "response_type": "code", 17 } 18 endpoint = "https://github.com/login/oauth/authorize" 19 response = requests.get(endpoint, params=params) 20 url = response.url 21 return url 22 23def exchange_code_for_access_token(code=None): 24 params = { 25 "client_id": CLIENT_ID, 26 "client_secret": CLIENT_SECRET, 27 "redirect_uri": REDIRECT_URI, 28 "code": code, 29 } 30 headers = {"Accept": "application/json"} 31 endpoint = "https://github.com/login/oauth/access_token" 32 response = requests.post(endpoint, params=params, headers=headers).json() 33 return response["access_token"] 34 35def print_user_info(access_token=None): 36 headers = {"Authorization": f"token {access_token}"} 37 endpoint = "https://api.github.com/user" 38 response = requests.get(endpoint, headers=headers).json() 39 name = response["name"] 40 username = response["login"] 41 private_repos_count = response["total_private_repos"] 42 print( 43 f"{name} ({username}) | private repositories: {private_repos_count}" 44 ) 45 46link = create_oauth_link() 47print(f"Follow the link to start the authentication with GitHub: {link}") 48code = input("GitHub code: ") 49access_token = exchange_code_for_access_token(code) 50print(f"Exchanged code {code} with access token: {access_token}") 51print_user_info(access_token=access_token)

      運行上面的代碼時會發生以下情況:

      會生成一個鏈接,要求您轉到 GitHub 頁面進行身份驗證。

      按照該鏈接并使用您的 GitHub 憑據登錄后,您將被重定向到您定義的回調 URL,其中包含code查詢參數中的一個字段:

      在您的控制臺中粘貼該代碼后,您可以將代碼交換為可重用的訪問令牌。

      您的用戶信息是使用該訪問令牌獲取的。打印您的姓名、用戶名和私有存儲庫計數。

      如果您按照上述步驟操作,那么您應該得到與此類似的最終結果:

      $ John Doe (johndoe) | number of private repositories: 42

      這里有很多步驟需要執行,但重要的是您要花時間真正理解每個步驟。大多數使用 OAuth 的 API 將共享許多相同的行為,因此當您從 API 讀取數據時,充分了解此過程將釋放很多潛力。

      隨意改進此示例并添加更多功能,例如獲取您的公開和已加星標的存儲庫或遍歷您的關注者以識別最受歡迎的存儲庫。

      網上有很多關于 OAuth 的優秀資源,如果使用 OAuth 背后的 API 是您真正需要的,那么我建議您專門對該主題進行更多研究。以下是一些不錯的起點:

      OAuth 到底是什么?

      OAuth 2 簡化版

      OAuth 2.0 授權框架

      從 API 消費的角度來看,當您與公共 API 交互時,了解 OAuth 肯定會派上用場。大多數 API 都采用 OAuth 作為其身份驗證標準,這是有充分理由的。

      分頁

      在客戶端和服務器之間來回發送大量數據是有代價的:帶寬。為了確保服務器可以處理大量請求,API 通常使用分頁。

      用非常簡單的術語來說,分頁是將大量數據分成多個更小的部分的行為。例如,每當您轉到Stack Overflow 中的問題頁面時,您都會在底部看到如下內容:

      您可能從許多其他網站上認識到這一點,并且不同網站的概念大致相同。具體對于API來說,這通常是借助查詢參數來處理的,主要有以下兩個:

      一page,您目前正在請求定義哪些頁面屬性

      甲size定義每個頁的大小屬性

      具體的查詢參數名稱可能因 API 開發人員的不同而有很大差異,但概念是相同的。一些 API 播放器也可能使用 HTTP 標頭或 JSON 響應來返回當前的分頁過濾器。

      再次使用 GitHub API,您可以在包含分頁查詢參數的文檔中找到事件端點。該參數per_page=定義要返回的項目數,并page=允許您對多個結果進行分頁。以下是如何使用這些參數:

      >>>

      >>> response = requests.get("https://api.github.com/events?per_page=1&page=0") >>> response.json()[0]["id"] '14345572615' >>> response = requests.get("https://api.github.com/events?per_page=1&page=1") >>> response.json()[0]["id"] '14345572808' >>> response = requests.get("https://api.github.com/events?per_page=1&page=2") >>> response.json()[0]["id"] '14345572100'

      使用第一個 URL,您只能獲取一個事件。但是使用page=查詢參數,您可以繼續對結果進行分頁,確保您能夠獲取所有事件而不會使 API 過載。

      限速

      鑒于 API 是面向公眾的,任何人都可以使用,懷有惡意的人經常試圖濫用它們。為防止此類攻擊,您可以使用一種稱為速率限制的技術,該技術限制用戶在給定時間范圍內可以發出的請求數量。

      如果您經常超過定義的速率限制,某些 API 實際上可能會阻止您的 IP 或 API 密鑰。注意不要超過 API 開發人員設置的限制。否則,您可能需要等待一段時間才能再次調用該 API。

      對于下面的示例,您將再次使用 GitHub API 和/events端點。根據其文檔,GitHub 每小時允許大約 60 個未經身份驗證的請求。如果超過該值,那么您將獲得 403 狀態代碼,并且在相當長的一段時間內將無法再進行任何 API 調用。

      警告:運行下一段代碼確實會在一段時間內阻止您調用 GitHub,因此在運行它之前,請確保您暫時不需要訪問 GitHub 的 API。

      為了演示起見,您將有目的地嘗試超過 GitHub 的速率限制,看看會發生什么。在下面的代碼中,您將請求數據,直到獲得除 之外的狀態代碼200 OK:

      >>>

      >>> endpoint = "https://api.github.com/events" >>> for i in range(100): >>> response = requests.get(endpoint) >>> print(f"{i} - {response.status_code}") >>> if response.status_code != 200: >>> break 0 - 200 1 - 200 2 - 200 3 - 200 4 - 200 5 - 200 ... 55 - 200 56 - 200 57 - 403 >>> response >>> response.json() {'message': "API rate limit exceeded for .", 'documentation_url': 'https://developer.github.com/v3/#rate-limiting'}

      你有它:在大約 60 個請求之后,API 停止返回200 OK響應并返回一個403 Forbidden響應,通知您超出了 API 速率限制。

      某些 API(如 GitHub 的)甚至可能在標頭中包含有關當前速率限制和剩余請求數的附加信息。這些對您避免超過定義的限制非常有幫助。看看最新的response.headers,看看你是否能找到那些特定的速率限制頭。

      使用 Python 使用 API:實際示例

      既然您已經了解了所有理論,并且已經嘗試了一些 API,那么您可以通過一些更實際的示例來鞏固這些知識。您可以修改下面的示例以根據您自己的目的定制它們。

      您可以通過下載以下鏈接中提供的源代碼來學習這些示例:

      搜索和獲取熱門 GIF

      如何制作一個小腳本,從GIPHY網站獲取前三名的熱門 GIF動圖?為此,您需要創建一個應用程序并從 GIPHY 獲取 API 密鑰。您可以通過展開下面的框找到說明,也可以查看 GIPHY 的快速入門文檔。

      創建 GIPHY 應用程序顯示隱藏

      在您掌握了 API 密鑰后,您就可以開始編寫一些代碼來使用該 API。但是,有時您想在實現大量代碼之前運行一些測試。我知道我知道。問題是,一些 API 實際上會為您提供直接從文檔或其儀表板中獲取 API 數據的工具。

      在這種特殊情況下,GIPHY 為您提供了一個API Explorer,在您創建應用程序后,它允許您開始使用 API,而無需編寫一行代碼。

      其他一些 API 將在文檔本身中為您提供資源管理器,這就是TheDogAPI在每個 API 參考頁面底部所做的。

      無論如何,您始終可以使用代碼來使用 API,這就是您在這里要做的。從儀表板中獲取 API 密鑰,通過替換API_KEY以下變量的值,您可以開始使用 GIPHY API:

      1import requests 2 3# Replace the following with the API key generated. 4API_KEY = "API_KEY" 5endpoint = "https://api.giphy.com/v1/gifs/trending" 6 7params = {"api_key": API_KEY, "limit": 3, "rating": "g"} 8response = requests.get(ENDPOINT, params=params).json() 9for gif in response["data"]: 10 title = gif["title"] 11 trending_date = gif["trending_datetime"] 12 url = gif["url"] 13 print(f"{title} | {trending_date} | {url}")

      在文件頂部的第 4 行和第 5 行,您定義了您API_KEY的 API 和 GIPHY API,endpoint因為它們不會像其他部分那樣經常更改。

      在第 7 行,利用您在查詢參數部分中學到的知識,定義params并添加您自己的 API 密鑰。您還包括一些其他過濾器:limit獲取3結果并rating僅獲取適當的內容。

      最后,在得到響應后,您在第 9 行遍歷結果。對于每個 GIF,您在第 13 行打印其標題、日期和 URL。

      在控制臺中運行這段代碼將輸出一個有點結構化的 GIF 列表:

      Excited Schitts Creek GIF by CBC | 2020-11-28 20:45:14 | https://giphy.com/gifs/cbc-schittscreek-schitts-creek-SiGg4zSmwmbafTYwpj Saved By The Bell Shrug GIF by PeacockTV | 2020-11-28 20:30:15 | https://giphy.com/gifs/peacocktv-saved-by-the-bell-bayside-high-school-dZRjehRpivtJsNUxW9 Schitts Creek Thank You GIF by CBC | 2020-11-28 20:15:07 | https://giphy.com/gifs/cbc-funny-comedy-26n79l9afmfm1POjC

      現在,假設您要制作一個腳本,允許您搜索特定單詞并獲取該單詞的第一個 GIPHY 匹配項。上面代碼的不同端點和輕微變化可以很快做到這一點:

      import requests # Replace the following with the API key generated. API_KEY = "API_KEY" endpoint = "https://api.giphy.com/v1/gifs/search" search_term = "shrug" params = {"api_key": API_KEY, "limit": 1, "q": search_term, "rating": "g"} response = requests.get(endpoint, params=params).json() for gif in response["data"]: title = gif["title"] url = gif["url"] print(f"{title} | {url}")

      你有它!現在您可以根據自己的喜好修改此腳本并按需生成 GIF。嘗試從您最喜歡的節目或電影中獲取 GIF,向您的終端添加快捷方式以按需獲取最流行的 GIF,或者與您最喜歡的消息傳遞系統(WhatsApp、Slack,等等)中的另一個 API 集成。然后開始向您的朋友和同事發送 GIF!

      獲得每個國家/地區的 COVID-19 確診病例

      盡管您現在可能已經厭倦了這件事,但有一個免費的 API,其中包含最新的全球 COVID-19 數據。此 API 不需要身份驗證,因此立即獲取一些數據非常簡單。您將在下面使用的免費版本具有速率限制和一些數據限制,但對于小型用例來說已經足夠了。

      對于此示例,您將獲得截至前一天的確診病例總數。我再次隨機選擇了德國作為國家,但您可以選擇任何您喜歡的國家/地區:

      1import requests 2from datetime import date, timedelta 3 4today = date.today() 5yesterday = today - timedelta(days=1) 6country = "germany" 7endpoint = f"https://api.covid19api.com/country/{country}/status/confirmed" 8params = {"from": str(yesterday), "to": str(today)} 9 10response = requests.get(endpoint, params=params).json() 11total_confirmed = 0 12for day in response: 13 cases = day.get("Cases", 0) 14 total_confirmed += cases 15 16print(f"Total Confirmed Covid-19 cases in {country}: {total_confirmed}")

      在第 1 行和第 2 行,您導入必要的模塊。在這種情況下,您必須導入date和timedelta對象才能獲得今天和昨天的日期。

      在第 6 行到第 8 行,您定義要使用的國家/地區 slug、端點和 API 請求的查詢參數。

      響應是天數列表,對于每一天,您都有一個Cases包含該日期確診病例總數的字段。在第 11 行,您創建了一個變量來保存已確診病例的總數,然后在第 14 行,您遍歷所有天數并將它們相加。

      打印最終結果將顯示所選國家/地區的確診病例總數:

      Total Confirmed Covid-19 cases in germany: 1038649

      在此示例中,您查看的是整個國家/地區的確診病例總數。但是,您也可以嘗試查看文檔并獲取特定城市的數據。為什么不讓它更徹底一點并獲得一些其他數據,例如已恢復的病例數?

      搜索 Google 圖書

      如果您對書籍充滿熱情,那么您可能需要一種快速搜索特定書籍的方法。您甚至可能希望將它連接到您當地圖書館的搜索,以查看使用該書的ISBN是否可以找到給定的書。

      對于此示例,您將使用Google Books API和公共卷端點來執行簡單的書籍搜索。

      這是moby dick在整個目錄中查找單詞的簡單代碼:

      1import requests 2 3endpoint = "https://www.googleapis.com/books/v1/volumes" 4query = "moby dick" 5 6params = {"q": query, "maxResults": 3} 7response = requests.get(endpoint, params=params).json() 8for book in response["items"]: 9 volume = book["volumeInfo"] 10 title = volume["title"] 11 published = volume["publishedDate"] 12 description = volume["description"] 13 print(f"{title} ({published}) | {description}")

      此代碼示例與您之前看到的代碼示例非常相似。從第 3 行和第 4 行開始,定義重要變量,例如端點,在本例中為查詢。

      發出 API 請求后,在第 8 行開始迭代結果。然后,在第 13 行,為與初始查詢匹配的每本書打印最有趣的信息:

      Moby-Dick (2016-04-12) | "Call me Ishmael." So begins the famous opening... Moby Dick (1892) | A literary classic that wasn't recognized for its... Moby Dick; Or, The Whale (1983-08-16) | The story of Captain Ahab's...

      您可以book在循環內打印變量以查看您還有哪些其他字段可用。以下是一些可能有助于進一步改進此代碼的內容:

      industryIdentifiers

      averageRating?和?ratingsCount

      imageLinks

      使用此 API 的一個有趣挑戰是使用您的OAuth 知識并創建您自己的書架應用程序,以記錄您閱讀或想要閱讀的所有書籍。之后您甚至可以將其連接到您最喜歡的書店或圖書館,以便從您的愿望清單中快速找到您附近有售的書籍。這只是一個想法——我相信你可以想出更多。

      結論

      關于 API,您還可以了解一百萬種其他內容:不同的標頭、不同的內容類型、不同的身份驗證技術等等。但是,您在本教程中學到的概念和技術將允許您使用自己喜歡的任何 API 進行練習,并使用 Python 來滿足您可能擁有的任何 API 使用需求。

      在本教程中,您學習了:

      什么的API是什么,你可以用它來

      什么狀態碼,HTTP頭和HTTP方法是

      如何使用 Python使用 API來消費公共數據

      使用Python 使用 API 時如何使用身份驗證

      繼續嘗試使用一些您喜歡的公共 API 來嘗試這項新的魔法技能吧!您還可以通過從以下鏈接下載源代碼來查看您在本教程中看到的示例:

      API Python

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:wps表格快捷鍵匯總
      下一篇:excel制作精美表格的方法(excel表格制作技巧大全)
      相關文章
      国产精品亚洲小说专区| 久久久影院亚洲精品| 亚洲国产av玩弄放荡人妇 | 日韩亚洲一区二区三区| 在线观看亚洲电影| 精品无码专区亚洲| 亚洲成aⅴ人片久青草影院按摩| 亚洲国产成人久久精品软件| 亚洲欧美日韩综合俺去了| 亚洲fuli在线观看| 久久久久亚洲国产| 亚洲国产精品成人AV在线 | 亚洲欧美日韩国产成人| 亚洲AV永久无码精品一福利| 在线亚洲v日韩v| 亚洲AV无码乱码精品国产| 亚洲av高清在线观看一区二区 | 午夜亚洲乱码伦小说区69堂| 国产成人 亚洲欧洲| 亚洲人成网站观看在线播放| 亚洲成a人片在线播放| 国产亚洲精aa成人网站| 日本亚洲成高清一区二区三区| 亚洲AV永久无码区成人网站| 亚洲尹人九九大色香蕉网站| 亚洲春色另类小说| 亚洲免费一级视频| 亚洲欧美日韩综合久久久| 国产亚洲精品美女久久久久久下载| 亚洲裸男gv网站| 国精无码欧精品亚洲一区| 亚洲日本在线观看| 亚洲依依成人精品| 欧美亚洲国产SUV| 久久影院亚洲一区| 久久久久亚洲精品成人网小说| 亚洲美女激情视频| 亚洲色大成网站WWW国产| 亚洲AV无码专区在线厂| 亚洲一级黄色视频| 久久精品亚洲综合专区|