Requests模組
requests
是一個非常流行的 Python 套件,用於發送 HTTP 請求。它的設計目的是使 HTTP 請求變得簡單易用。以下是對 requests
套件的介紹:
主要特點
- 簡單性:
requests
的接口直觀且易於使用,使得發送各種 HTTP 請求變得簡單。 - 靈活性:支持 GET、POST、PUT、DELETE 等多種 HTTP 方法。
- 自動處理:自動處理諸如重定向、會話(sessions)、cookies 等常見任務。
- 自定義和擴展性:允許使用者自定義頭部(headers)、參數(params)、資料(data)和 JSON。
- 豐富的功能:支持 SSL 請求、身份驗證、代理設置等。
基本使用
安裝:可以透過 pip 安裝 requests
:
pip install requests
GET 請求:獲取網頁內容
- 參數附加在 URL 上:GET 請求通常將參數附加在 URL 的末尾,參數之間用
&
分隔,並且以?
開始。 - 數據可見性:由於參數附加在 URL 上,因此
數據對任何人都是可見的
,這意味著敏感信息不應該通過 GET 方法傳輸。 - 長度限制:URL 的長度有限制(由瀏覽器和伺服器決定),這意味著 GET 請求的
參數有長度限制
。 - 適用於數據檢索:GET 主要用於請求數據,而不是發送數據給伺服器。
- 使用場景:用於請求頁面、圖片、執行查詢等,通常不改變服務器狀態。
import requests
# 直接在 URL 夾帶參數
response = requests.get('https://httpbin.org/get?key1=value1&key2=value2')
print(response.text) # 輸出網頁內容
# 參數不夾帶在URL
params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://httpbin.org/get', params=params)
POST 請求:提交表單
- 參數包含在請求主體中:POST 請求將數據作為請求
主體發送
。這意味著參數不會出現在 URL 中。 - 數據隱私性更好:由於數據不在 URL 中顯示,因此 POST 方法
適合傳輸敏感或私密數據
。 - 無長度限制:POST 請求
沒有數據長度限制
,適用於大量數據的傳輸。 - 適用於數據提交:POST 常用於向伺服器提交表單數據或上傳文件。
- 使用場景:用於提交表單、上傳文件、進行交易等,可能會改變服務器狀態或數據。
payload = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('https://httpbin.org/post', data=payload)
print(response.text)
常用方法
方法 | 說明 | 範例 |
---|---|---|
GET | 向指定的資源發送一個 HTTP GET 請求,用於請求數據。 | requests.get(‘https://httpbin.org’, params={‘key’: ‘value’}) |
POST | 向指定資源提交數據進行處理請求。通常用於提交表單。 | requests.post(‘https://httpbin.org’, data={‘key’: ‘value’}) |
PUT | 向指定資源位置上傳其最新內容。 | requests.put(‘https://httpbin.org’, data={‘key’: ‘value’}) |
DELETE | 請求伺服器刪除指定的資源。 | requests.delete(‘https://httpbin.org’) |
PATCH | 對資源進行部分修改。 | requests.patch(‘https://httpbin.org’, data={‘key’: ‘value’}) |
使用頭部:
在 requests
模組中,HTTP 請求的頭部(Headers)是關鍵的組成部分,用於在發送請求時向伺服器提供額外的上下文信息。頭部是由一系列的鍵值對構成的,它們定義了請求的許多重要屬性,如內容類型、用戶代理、認證信息等。
頭部的主要作用
- 用戶代理(User-Agent):標識發出請求的客戶端軟件,常用於伺服器識別請求來源。
- 內容類型(Content-Type):指定發送數據的格式,如
application/json
、application/x-www-form-urlencoded
。 - 接受(Accept):指定客戶端能夠接收的回應內容類型。
- 認證(Authorization):包含用於認證的憑證,如基本認證的用戶名和密碼,或者是令牌。
- 緩存控制(Cache-Control):指示緩存行為,如
no-cache
或max-age
。 - 接受語言(Accept-Language):指定客戶端偏好的語言,用於內容協商。
如何在 requests
中設置頭部
在 requests
中,可以在發送請求時通過 headers
參數自定義頭部:
headers = {
'User-Agent': 'MyApp/1.0',
'Accept': 'application/json',
'Authorization': 'Bearer <TOKEN>'
}
response = requests.get('https://httpbin.org', headers=headers)
頭部注意事項
- 安全性:在設置頭部時,應避免發送敏感信息,除非確保通訊過程的安全性(如使用 HTTPS)。
- 合規性:應正確使用頭部信息,尊重 HTTP 協議的標準和伺服器的要求,特別是在使用
Authorization
頭部時。
常見頭部設定
參數 | 說明 | 範例 |
---|---|---|
User-Agent | 標識發出請求的客戶端類型。 | ‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36’ |
Accept | 指定客戶端能夠接收的內容類型。 | ‘Accept’: ‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8′ |
Content-Type | 發送數據到伺服器時的內容類型。 | ‘Content-Type’: ‘application/json’ |
Authorization | 用於認證的憑據,如基本認證或令牌。 | ‘Authorization’: ‘Bearer YOUR_TOKEN’ |
Accept-Encoding | 標識客戶端支持的內容編碼類型。 | ‘Accept-Encoding’: ‘gzip, deflate, br’ |
Connection | 控制是否保持網絡連接的活躍。 | ‘Connection’: ‘keep-alive’ |
Host | 指定發送請求的目標伺服器。 | ‘Host’: ‘example.com’ |
Referer | 指示請求的原始資源的地址。 | ‘Referer’: ‘https://www.example.com’ |
Cookie | 從客戶端傳送到伺服器的 Cookie。 | ‘Cookie’: ‘name=value; name2=value2’ |
處理回應:
當使用 requests
模組進行 HTTP 請求時,伺服器的回應(即回傳的資料)可以通過 Response
對象來訪問和解析。以下是如何解析 requests
回傳的資料的不同方面:
狀態碼
在使用 requests
模組進行 HTTP 請求時,伺服器會返回不同的 HTTP 狀態碼,以表示請求的結果。以下是一些常見的 HTTP 狀態碼及其說明:
response = requests.get('https://example.com')
status_code = response.status_code
代碼 | 說明 |
---|---|
200 | OK – 請求成功處理。 |
201 | Created – 請求成功並創建了新的資源。 |
202 | Accepted – 請求已被接受進行處理,但處理尚未完成。 |
204 | No Content – 請求成功,但沒有新的內容返回。 |
301 | Moved Permanently – 請求的資源已永久移動到新位置。 |
302 | Found – 請求的資源臨時從不同的 URI 回應。 |
400 | Bad Request – 伺服器無法或不會處理請求(客戶端錯誤)。 |
401 | Unauthorized – 認證失敗或未提供認證。 |
403 | Forbidden – 伺服器拒絕請求。 |
404 | Not Found – 找不到請求的資源。 |
405 | Method Not Allowed – 不允許使用請求中指定的方法。 |
500 | Internal Server Error – 伺服器遇到了不知道如何處理的情況。 |
502 | Bad Gateway – 獲取請求的伺服器,從上游伺服器收到無效回應。 |
503 | Service Unavailable – 伺服器目前無法使用(超載或停機維護)。 |
504 | Gateway Timeout – 未能及時從上游伺服器或輔助伺服器收到請求。 |
這些狀態碼是根據 HTTP 標準定義的,代表了伺服器對 HTTP 請求的不同回應。在使用 requests
或其他 HTTP 客戶端進行網絡請求時,正確理解這些狀態碼對於處理不同的回應非常重要。
回應內容
- 文本內容:
- 用於獲取伺服器返回的文本內容,如 HTML 或純文本。
text_content = response.text
- 二進制內容:
- 用於獲取非文本(如圖片或文件)的原始二進制數據。
binary_content = response.content
- JSON 數據:
- 如果回應的內容是 JSON 格式,可以直接解析成 Python 的字典。
json_data = response.json()
回應頭部
- 回應頭部包含了伺服器對於請求的元數據,如內容類型、伺服器信息等。
headers = response.headers
編碼
- 獲取或設置編碼,可以查看或手動設置回應的字符編碼。
encoding = response.encoding
response.encoding = 'utf-8'
Cookies
- 獲取回應中的 Cookies:
cookies = response.cookies
重定向和歷史
- 如果請求經過重定向,可以查看整個重定向的歷史。
history = response.history
通過以上方法,您可以根據需要從 requests
的回應中提取和處理各種數據。在實際的應用中,根據伺服器回應的特點和需求選擇合適的解析方式非常重要。
注意事項
- 異常處理:使用
requests
時應注意處理可能出現的異常,如ConnectionError
、Timeout
等。 - 資源管理:建議使用
with
語句管理回應對象,以確保釋放網絡資源。 - 安全與合規性:在使用
requests
進行網路爬蟲時,應尊重目標網站的robots.txt
規則,並確保符合相關法律法規。
requests
的功能強大且使用方便,是 Python 網路程式設計和網路爬蟲的重要工具之一。
HTTPBin 線上服務
HTTPBin 是一個線上服務,用於測試 HTTP 請求和回應。它提供了一系列端點,每個端點都展示了特定類型的行為,使得開發者可以測試和理解 HTTP 協議的不同方面。HTTPBin 對於學習 HTTP 協議、調試和測試客戶端(如網頁瀏覽器和 HTTP 客戶端庫)非常有用。
主要特點
- 多樣的測試端點:HTTPBin 提供了多種測試端點,包括用於測試 GET、POST、PUT、DELETE 請求的端點。
- 支持自定義請求:你可以發送帶有自定義頭部、cookies 和數據的請求,HTTPBin 將返回一個描述這些請求的回應。
- 查看返回信息:HTTPBin 返回的信息包括客戶端 IP 地址、請求頭部、請求數據、cookies 等,有助於理解 HTTP 請求和回應的結構。
- JSON 回應:HTTPBin 的大多數端點都返回 JSON 格式的數據,方便解析和處理。
常用端點
/ip
:返回請求者的 IP 地址。/user-agent
:返回請求者的 User-Agent 信息。/headers
:返回請求的 HTTP 頭部信息。/get
:返回 GET 請求數據。/post
:返回 POST 請求數據。/status/:code
:返回一個特定的 HTTP 狀態碼。/response-headers
:返回自定義的回應頭部。/redirect/:n
:重定向到一個新的 URL,次數為n
。/cookies
:返回請求中的 cookies。/delay/:n
:在回應之前等待n
秒。
應用場景
- 學習和教育:HTTPBin 是一個非常好的學習工具,用於教育和理解 HTTP 請求和回應。
- 客戶端測試:開發者可以使用 HTTPBin 來測試和調試 HTTP 客戶端和庫,驗證它們是否按預期發送請求。
- API 交互實驗:HTTPBin 可以用於實驗性地構建和測試 API 交互,特別是對於理解不同 HTTP 方法和狀態碼的行為。
總之,HTTPBin 是一個實用的工具,無論是對於學習 HTTP 協議的新手還是需要測試和調試 HTTP 請求的經驗豐富的開發者。
範例: 抓取 Yahoo 股市網頁資訊
使用瀏覽器,在網頁上直接查看 原始碼
透過 Python Requests
程式 抓取網頁資訊
import requests
response = requests.get('https://tw.stock.yahoo.com/')
print(response.text[0:1000]) # 印出前1000個字
結語
在開始使用 requests 模組之前,建議先對 HTTP 傳輸協定有一定的了解和認識。實際上,requests 模組是一個建立在 HTTP 協定之上的工具,它的主要功能是協助我們通過網絡請求來獲取資料,無論是 HTML 頁面內容還是 JSON 格式的數據。因此,對 HTTP 協定的基本原理和操作有所熟悉,將有助於您更有效地使用 requests 模組,並能更好地理解網路請求和響應的過程。這包括瞭解不同的 HTTP 方法、狀態碼、請求頭部以及如何處理響應數據等。掌握這些基礎知識,將為您在網絡程式開發領域的進一步學習和實踐打下堅實的基礎。
Python基礎系列文章
[Python教學]開發工具介紹
[開發工具] Google Colab 介紹
[Python教學] 資料型態
[Python教學] if判斷式
[Python教學] List 清單 和 Tuple元組
[Python教學] for 和 while 迴圈
[Python教學] Dictionary 字典 和 Set 集合
[Python教學] Dictionary 字典 和 Set 集合
[Python教學] Function 函示
[Python教學] Class 類別
[Python教學] 例外處理
[Python教學] 檔案存取
[Python教學] 實作密碼產生器
[Python教學] 日期時間
[Python教學] 日期時間
[Python教學] 套件管理