首頁 > 後端開發 > Python教學 > 用Python從HTTP API獲取數據

用Python從HTTP API獲取數據

Christopher Nolan
發布: 2025-02-10 15:11:12
原創
748 人瀏覽過

Fetching Data from an HTTP API with Python

Python高效訪問HTTP API:requests庫與請求緩存

本文節選自《實用Python》,作者Stuart演示瞭如何利用Python和幾個第三方模塊輕鬆訪問HTTP API。

大多數情況下,處理第三方數據需要訪問HTTP API,即向設計為機器讀取而非人工讀取的網頁發出HTTP請求。 API數據通常採用機器可讀格式,通常為JSON或XML。 讓我們看看如何使用Python訪問HTTP API。

使用HTTP API的基本原則很簡單:

  1. 向API的URL發出HTTP請求,可能包括一些身份驗證信息(例如API密鑰)以證明我們已獲得授權。
  2. 獲取數據。
  3. 利用數據完成有用的操作。

Python標準庫提供了足夠的函數來完成所有這些操作,無需任何附加模塊,但如果我們使用幾個第三方模塊來簡化流程,將會使我們的工作更輕鬆。第一個是requests模塊。這是一個用於Python的HTTP庫,它使獲取HTTP數據比Python內置的urllib.request更便捷,可以使用python -m pip install requests安裝。

為了展示其易用性,我們將使用Pixabay的API(此處有文檔)。 Pixabay是一個圖片網站,所有圖片都可以重複使用,這使其成為一個非常方便的資源。我們將關注水果圖片。稍後在操作文件時,我們將使用收集到的水果圖片,但現在我們只想找到水果圖片。

首先,我們將快速查看Pixabay上有哪些圖片可用。我們將抓取一百張圖片,快速瀏覽它們,然後選擇我們想要的圖片。為此,我們需要一個Pixabay API密鑰,因此我們需要創建一個帳戶,然後從API文檔的“搜索圖片”部分獲取密鑰。

requests模塊

使用requests模塊向API發出HTTP請求的基本版本包括構建HTTP URL、發出請求以及讀取響應。此處,響應採用JSON格式。 requests模塊使每個步驟都非常簡單。 API參數是一個Python字典,get()函數發出調用,如果API返回JSON,requests會將其作為響應中的.json提供。因此,簡單的調用如下所示:

import requests

PIXABAY_API_KEY = "11111111-7777777777777777777777777"

base_url = "https://pixabay.com/api/"
base_params = {
    "key": PIXABAY_API_KEY,
    "q": "fruit",
    "image_type": "photo",
    "category": "food",
    "safesearch": "true"
}

response = requests.get(base_url, params=base_params)
results = response.json()
登入後複製

這將返回一個Python對象,正如API文檔所建議的那樣,我們可以查看其各個部分:

為了獲取一百個結果,我們可以簡單地決定進行五次調用,每次調用獲取20個結果,但這不夠穩健。更好的方法是循環請求頁面,直到獲得所需的一百個結果,然後停止。這可以防止在Pixabay更改默認結果數量(例如更改為15)時出現問題。它還可以讓我們處理搜索詞沒有一百張圖片的情況。因此,我們使用一個while循環,每次遞增頁碼,如果我們已經達到100張圖片,或者沒有圖片可檢索,我們就退出循環:

緩存HTTP請求

避免多次向HTTP API發出相同的請求是個好主意。許多API都有使用限制,以避免被請求者過度使用,請求需要花費時間和精力。我們應該盡量避免重複之前的請求。幸運的是,在使用Python的requests模塊時,有一種有用的方法可以做到這一點:使用python -m pip install requests-cache安裝requests-cache。這將無縫記錄我們進行的任何HTTP調用並保存結果。然後,稍後如果我們再次進行相同的調用,我們將獲得本地保存的結果,而無需再次訪問API。這節省了時間和帶寬。要使用requests_cache,請導入它並創建一個CachedSession,然後使用session.get而不是requests.get來獲取URL,我們將無需額外努力即可獲得緩存的好處:

生成輸出

為了查看查詢結果,我們需要在某個地方顯示圖片。一種便捷的方法是創建一個簡單的HTML頁面來顯示每個圖片。 Pixabay提供了每個圖片的小縮略圖,它在API響應中稱為previewURL,因此我們可以創建一個HTML頁面來顯示所有這些縮略圖,並將它們鏈接到主要Pixabay頁面——我們可以從中選擇下載我們想要的圖片並為攝影師署名。因此,頁面中的每個圖片可能如下所示:

我們可以使用列表推導式從images列表構建它,然後使用"n".join()將所有結果連接成一個大的字符串:

然後,如果我們寫出一個包含該列表的非常簡單的HTML頁面,則很容易在Web瀏覽器中打開它,快速查看我們從API獲得的所有搜索結果,並單擊其中任何一個跳轉到完整的Pixabay頁面進行下載:

Fetching Data from an HTTP API with Python

本文節選自《實用Python》,可在SitePoint Premium和電子書零售商處購買。

(以下為FAQs,已根據原文進行改寫和精簡)

關於使用Python的HTTP API獲取數據的常見問題 (FAQs)

  • HTTP和HTTPS的區別是什麼? HTTP是超文本傳輸協議,HTTPS是安全超文本傳輸協議。主要區別在於HTTPS使用SSL證書建立服務器和客戶端之間安全的加密連接,而HTTP則沒有。這使得HTTPS在傳輸敏感數據(如信用卡信息或登錄憑據)時更安全。

  • Python中HTTP是如何工作的? Python中可以使用多個庫發出HTTP請求,最常用的是requests。該庫允許您發送HTTP請求並處理響應,包括處理Cookie、表單數據、多部分文件等等。它是與Web服務交互的強大工具,可用於各種應用程序。

  • 常見的HTTP方法有哪些?如何在Python中使用它們? 最常見的HTTP方法是GET、POST、PUT、DELETE、HEAD、OPTIONS和PATCH。在Python中,可以使用requests庫使用這些方法。例如,要發送GET請求,可以使用requests.get(url),要發送POST請求,可以使用requests.post(url, data)

  • 如何在Python中處理HTTP響應? 當您使用requests庫在Python中發送HTTP請求時,會得到一個Response對象。此對象包含服務器對您請求的響應。如果響應採用JSON格式,您可以使用response.textresponse.json()訪問響應的內容。您還可以使用response.status_code檢查響應的狀態代碼。

  • 如何在Python中使用HTTP標頭? 通過將HTTP標頭作為字典傳遞給requests函數的headers參數,可以在Python中使用它們。例如,requests.get(url, headers={'User-Agent': 'my-app'})。標頭可用於提供有關請求或客戶端的其他信息,例如用戶代理、內容類型、授權等等。

  • 如何在Python中處理Cookie? 可以使用Response對象的cookies屬性在Python中處理Cookie。您可以使用response.cookies訪問服務器發送的Cookie,並通過將Cookie作為字典傳遞給requests函數的cookies參數來將Cookie發送到服務器。

  • 如何在Python中使用POST請求發送表單數據? 通過將表單數據作為字典傳遞給requests.post函數的data參數,可以在Python中使用POST請求發送它。例如,requests.post(url, data={'key': 'value'})requests庫將自動以正確的格式編碼數據。

  • 如何在Python中使用POST請求發送文件? 通過將文件作為字典傳遞給requests.post函數的files參數,可以在Python中使用POST請求發送文件。字典應包含文件字段的名稱作為鍵,以及包含文件名和文件對象的元組作為值。

  • 如何處理requests庫在Python中的錯誤和異常? Python中的requests庫會針對某些類型的錯誤(例如網絡錯誤或超時)引發異常。您可以使用try/except塊捕獲這些異常並適當地處理它們。您還可以檢查響應的狀態代碼來處理HTTP錯誤。

  • 如何在Python中發出異步HTTP請求? 可以使用aiohttp庫在Python中發出異步HTTP請求。該庫允許您異步發送HTTP請求和處理響應,這在處理大量請求時可以顯著提高應用程序的性能。

以上是用Python從HTTP API獲取數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板