Python高效訪問HTTP API:requests庫與請求緩存
本文節選自《實用Python》,作者Stuart演示瞭如何利用Python和幾個第三方模塊輕鬆訪問HTTP API。
大多數情況下,處理第三方數據需要訪問HTTP API,即向設計為機器讀取而非人工讀取的網頁發出HTTP請求。 API數據通常採用機器可讀格式,通常為JSON或XML。 讓我們看看如何使用Python訪問HTTP API。
使用HTTP API的基本原則很簡單:
Python標準庫提供了足夠的函數來完成所有這些操作,無需任何附加模塊,但如果我們使用幾個第三方模塊來簡化流程,將會使我們的工作更輕鬆。第一個是requests
模塊。這是一個用於Python的HTTP庫,它使獲取HTTP數據比Python內置的urllib.request
更便捷,可以使用python -m pip install requests
安裝。
為了展示其易用性,我們將使用Pixabay的API(此處有文檔)。 Pixabay是一個圖片網站,所有圖片都可以重複使用,這使其成為一個非常方便的資源。我們將關注水果圖片。稍後在操作文件時,我們將使用收集到的水果圖片,但現在我們只想找到水果圖片。
首先,我們將快速查看Pixabay上有哪些圖片可用。我們將抓取一百張圖片,快速瀏覽它們,然後選擇我們想要的圖片。為此,我們需要一個Pixabay API密鑰,因此我們需要創建一個帳戶,然後從API文檔的“搜索圖片”部分獲取密鑰。
使用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 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頁面進行下載:
本文節選自《實用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.text
或response.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中文網其他相關文章!