【Python Requests 庫詳解】

目錄

    • 簡介
    • 一、安裝與導入
      • 安裝
      • 導入
    • 二、發送 HTTP 請求
      • 1. GET 請求
        • 基本請求
        • URL 參數
      • 2. POST 請求
        • 表單數據提交
        • JSON 數據提交
        • 文件上傳
      • 3. 其他方法
        • PUT 請求示例
        • DELETE 請求示例
    • 三、處理響應
      • 1. 響應內容解析
        • 文本內容處理
        • 二進制內容處理
        • JSON 數據處理
      • 2. 響應狀態與頭信息
        • 狀態碼檢查
        • 異常處理
        • 響應頭解析
    • 四、高級功能
      • 1. 會話(Session)管理
      • 2. 代理設置
      • 3. 超時控制
      • 4. SSL 驗證
        • 禁用驗證(測試環境使用)
        • 自定義證書
    • 五、異常處理
      • 完整異常處理示例
    • 六、其他實用功能
      • 1. Cookie 操作
      • 2. 重定向控制
      • 3. 流式下載大文件
      • 4. 身份認證
    • 七、最佳實踐
      • 推薦做法
      • 特點說明

簡介

requests 是 Python 中最流行的 HTTP 客戶端庫,以簡潔的 API 設計和強大的功能著稱。以下是其核心知識點的詳細說明及代碼示例。


一、安裝與導入

安裝

# 使用 pip 安裝 requests 庫
pip install requests

導入

# 導入 requests 模塊
import requests

二、發送 HTTP 請求

1. GET 請求

基本請求
# 發送一個簡單的 GET 請求
response = requests.get("https://api.example.com/data")
print("響應狀態碼:", response.status_code)
URL 參數
# 通過 params 參數傳遞 URL 查詢參數
params = {"page": 1,          # 當前頁碼"limit": 10,        # 每頁數據量"sort": "desc"      # 排序方式
}
response = requests.get("https://api.example.com/items", params=params)
print("實際請求的 URL:", response.url)  # 輸出構造后的完整 URL

2. POST 請求

表單數據提交
# 模擬表單提交(Content-Type: application/x-www-form-urlencoded)
form_data = {"username": "admin","password": "secret"
}
response = requests.post("https://api.example.com/login", data=form_data)
print("登錄響應:", response.text)
JSON 數據提交
# 發送 JSON 格式數據(Content-Type: application/json)
user_info = {"name": "Alice","age": 25,"email": "alice@example.com"
}
response = requests.post("https://api.example.com/users", json=user_info)
print("創建用戶結果:", response.json())
文件上傳
# 上傳本地文件(Content-Type: multipart/form-data)
with open("report.pdf", "rb") as file:  # 以二進制模式打開文件files = {"document": ("report.pdf", file, "application/pdf")}response = requests.post("https://api.example.com/upload", files=files)
print("文件上傳結果:", response.json())

3. 其他方法

PUT 請求示例
# 更新資源(例如修改用戶信息)
update_data = {"email": "new_email@example.com"}
response = requests.put("https://api.example.com/users/123", json=update_data)
print("更新結果狀態碼:", response.status_code)
DELETE 請求示例
# 刪除資源(例如刪除文章)
response = requests.delete("https://api.example.com/articles/456")
print("刪除操作狀態碼:", response.status_code)

三、處理響應

1. 響應內容解析

文本內容處理
# 獲取響應文本(自動解碼)
response = requests.get("https://api.example.com/text")
print("文本內容:", response.text[:100])  # 截取前 100 個字符
二進制內容處理
# 下載圖片并保存到本地
response = requests.get("https://example.com/image.jpg")
with open("image.jpg", "wb") as f:  # 以二進制寫入模式保存f.write(response.content)
print("圖片下載完成")
JSON 數據處理
# 解析 JSON 響應(自動轉換為字典)
response = requests.get("https://api.example.com/products/789")
product = response.json()
print(f"產品名稱: {product['name']}, 價格: {product['price']}元")

2. 響應狀態與頭信息

狀態碼檢查
response = requests.get("https://api.example.com/health")
if response.status_code == 200:print("服務正常")
elif response.status_code == 404:print("資源不存在")
else:print("未知狀態:", response.status_code)
異常處理
# 自動拋出 HTTP 錯誤
try:response = requests.get("https://api.example.com/error")response.raise_for_status()  # 如果狀態碼是 4xx/5xx 會拋出異常
except requests.HTTPError as err:print(f"HTTP 錯誤: {err}")
響應頭解析
response = requests.head("https://example.com")  # HEAD 請求只獲取頭信息
print("服務器類型:", response.headers.get("Server", "未知"))
print("內容類型:", response.headers.get("Content-Type", "未指定"))

四、高級功能

1. 會話(Session)管理

# 使用 Session 保持登錄狀態和連接池
with requests.Session() as session:# 第一次請求:登錄login_data = {"user": "admin", "pass": "123456"}session.post("https://api.example.com/login", data=login_data)# 后續請求:自動攜帶 Cookieprofile = session.get("https://api.example.com/profile").json()orders = session.get("https://api.example.com/orders").json()print("用戶信息:", profile)

2. 代理設置

# 通過代理服務器發送請求
proxies = {"http": "http://10.10.1.10:3128",   # HTTP 代理"https": "http://10.10.1.10:1080"   # HTTPS 代理
}
try:response = requests.get("http://external-site.com", proxies=proxies, timeout=5)print("通過代理訪問成功")
except requests.ConnectTimeout:print("代理連接超時")

3. 超時控制

# 設置連接超時和讀取超時(元組格式)
try:response = requests.get("https://slow-api.example.com", timeout=(3.05, 10))# 連接超時 3.05 秒,讀取超時 10 秒
except requests.Timeout:print("請求超時,請重試")

4. SSL 驗證

禁用驗證(測試環境使用)
# 注意:verify=False 會忽略 SSL 證書驗證(不安全!)
response = requests.get("https://self-signed-cert-site.com", verify=False)
print("跳過 SSL 驗證結果:", response.status_code)
自定義證書
# 使用自定義 CA 證書驗證
response = requests.get("https://internal-api.example.com", verify="/path/to/corporate-ca-bundle.crt")
print("自定義證書驗證成功")

五、異常處理

完整異常處理示例

from requests.exceptions import RequestExceptionurl = "https://unstable-api.example.com/data"try:# 設置超時和重試response = requests.get(url, timeout=5)response.raise_for_status()  # 檢查 4xx/5xx 錯誤# 處理成功響應data = response.json()print("獲取數據成功:", data["key"])except requests.Timeout:print("錯誤: 請求超時(5 秒)")
except requests.HTTPError as e:print(f"HTTP 錯誤: {e.response.status_code} - {e.response.reason}")
except requests.JSONDecodeError:print("錯誤: 響應不是有效的 JSON")
except RequestException as e:print(f"請求失敗: {str(e)}")

六、其他實用功能

1. Cookie 操作

# 手動設置 Cookie
cookies = {"session_id": "abc123xyz"}
response = requests.get("https://api.example.com/cart", cookies=cookies)
print("購物車內容:", response.json())# 獲取服務器設置的 Cookie
print("服務器返回的 Cookies:")
for cookie in response.cookies:print(f"{cookie.name}: {cookie.value}")

2. 重定向控制

# 禁用自動重定向
response = requests.get("https://example.com/old-url", allow_redirects=False)
if response.status_code == 301:new_location = response.headers["Location"]print(f"需要手動跳轉到: {new_location}")

3. 流式下載大文件

# 分塊下載大文件(避免內存溢出)
url = "https://example.com/large-video.mp4"
with requests.get(url, stream=True) as r:r.raise_for_status()with open("video.mp4", "wb") as f:for chunk in r.iter_content(chunk_size=8192):  # 8KB 塊f.write(chunk)
print("大文件下載完成")

4. 身份認證

# 使用 Basic 認證
from requests.auth import HTTPBasicAuthresponse = requests.get("https://api.example.com/secured",auth=HTTPBasicAuth("user", "pass"))
print("認證結果:", response.status_code)

七、最佳實踐

推薦做法

  1. 會話復用

    # 使用 with 語句自動管理 Session
    with requests.Session() as s:s.headers.update({"User-Agent": "MyApp/1.0"})  # 統一設置請求頭s.get("https://api.example.com/ping")          # 測試連接
    
  2. 超時必填

    # 所有請求都應該設置超時
    requests.get("https://example.com", timeout=(3, 10))  # 連接 3 秒,讀取 10 秒
    
  3. 資源釋放

    # 使用 with 語句確保響應資源釋放
    with requests.get("https://example.com", stream=True) as response:# 處理響應內容pass
    
  4. 錯誤重試

    # 實現簡單重試邏輯
    retries = 3
    for _ in range(retries):try:response = requests.get(url, timeout=5)response.raise_for_status()breakexcept (RequestException, Timeout):continue
    

官方文檔:https://docs.python-requests.org/


特點說明

  1. 代碼注釋:每個示例都添加了詳細的注釋,說明代碼用途和關鍵參數
  2. 場景覆蓋:包含常見場景(登錄、文件傳輸、錯誤處理)和特殊需求(代理、SSL 驗證)
  3. 安全提示:在禁用 SSL 驗證等危險操作時添加警告說明
  4. 最佳實踐:強調超時設置、會話管理和資源釋放的重要性

可直接保存為 .md 文件或導入到文檔工具中使用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/77545.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/77545.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/77545.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Python 開源】你的 Windows 關機助手——PyQt5 版定時關機工具

🖥? 你的 Windows 關機助手——PyQt5 版定時關機工具 相關資源文件已經打包成EXE文件,可雙擊直接運行程序,且文章末尾已附上相關源碼,以供大家學習交流,博主主頁還有更多Python相關程序案例,秉著開源精神的…

【MySQL】002.MySQL數據庫基礎

文章目錄 數據庫基礎1.1 什么是數據庫1.2 基本使用創建數據庫創建數據表表中插入數據查詢表中的數據 1.3 主流數據庫1.4 服務器,數據庫,表關系1.5 MySQL架構1.6 SQL分類1.7 存儲引擎1.7.1 存儲引擎1.7.2 查看存儲引擎1.7.3 存儲引擎對比 前言&#xff1a…

滑動窗口(3)—無重復字符的最長子串

文章目錄 題目解析方法一:滑動窗口解法二(暴?求解)(不會超時,可以通過):附Java代碼 力扣題目:無重復字符的最長子串 題目解析 方法一:滑動窗口 思路和算法 我們先用一…

C++字符串操作詳解

引言 字符串處理是編程中最常見的任務之一,而在C中,我們有多種處理字符串的方式。本文將詳細介紹C中的字符串操作,包括C風格字符串和C的string類。無論你是C新手還是想鞏固基礎的老手,這篇文章都能幫你梳理字符串處理的關鍵知識點…

Vulhub-DC-4靶場通關攻略

下載地址:https://www.vulnhub.com/entry/dc-4,313/ 掃描IP地址 arp-sacn -l掃描端口,開啟了80和22端口 nmap -p- 192.168.112.140訪問80端口 掃描目錄,并沒有發現敏感目錄 嘗試爆破 爆破成功,用戶名admin 密碼happy 登錄成功 …

OfficePlus去掉PDF文件右鍵菜單里的PDF轉換

今天在吾愛破解論壇看到一個求助帖,說是OfficePlus,安裝后,PDF文件的右鍵菜單里多了PDF轉換,想去掉,不知道怎么弄。底下的回復基本都是百度復制或者AI搜索出的答案,大致就是找注冊表里CLASSID下的菜單欄相關…

大模型本地部署系列(3) Ollama部署QwQ[阿里云通義千問]

大家好,我是AI研究者, 今天教大家部署 一個阿里云通義千問大模型。 QwQ大模型簡介 QwQ是由阿里云通義千問(Qwen)團隊推出的開源推理大模型,專注于提升AI在數學、編程和復雜邏輯推理方面的能力。其核心特點包括&#x…

微信小程序學習實錄12:掌握大數據量軌跡展示的MySQL結構設計

獲取經緯度信息后,mysql建立數據表po_trajectory,字段包含tra_id、longitude、latitude、tra_time和openid。 為微信小程序創建的 po_trajectory 數據表,字段包含 tra_id、longitude、latitude、tra_time 和 openid,從結構設計上…

計算機系統---性能指標(3)續航與散熱

計算機電池續航的性能指標 一、電池基礎物理指標 電池容量(核心指標) 單位: 毫安時(mAh):常見于手機/平板,反映電池存儲電荷量,需結合電壓計算實際能量(如3.7V電池&…

貪心算法之最小生成樹問題

1. 貪心算法的基本思想 貪心算法在每一步都選擇局部最優的邊,希望最終得到整體最優的生成樹。常見的兩種 MST 算法為 Kruskal 算法 和 Prim 算法。這兩者均滿足貪心選擇性質和最優子結構性質,即: 貪心選擇性質:局部最優選擇&…

LeetCode hot 100—編輯距離

題目 給你兩個單詞 word1 和 word2, 請返回將 word1 轉換成 word2 所使用的最少操作數 。 你可以對一個單詞進行如下三種操作: 插入一個字符刪除一個字符替換一個字符 示例 示例 1: 輸入:word1 "horse", word2 &q…

2.3 Spark運行架構與流程

Spark運行架構與流程包括幾個核心概念:Driver負責提交應用并初始化作業,Executor在工作節點上執行任務,作業是一系列計算任務,任務是作業的基本執行單元,階段是一組并行任務。Spark支持多種運行模式,包括單…

NO.82十六屆藍橋杯備戰|動態規劃-從記憶化搜索到動態規劃|下樓梯|數字三角形(C++)

記憶化搜索 在搜索的過程中,如果搜索樹中有很多重復的結點,此時可以通過?個"備忘錄",記錄第?次搜索到的結果。當下?次搜索到這個結點時,直接在"備忘錄"??找結果。其中,搜索樹中的?個?個結點…

使用 VBA 宏創建一個選擇全部word圖片快捷指令,進行圖片格式編輯

使用 VBA 宏批量選擇圖片 ? 第一步:創建 .dotm 加載項文件 1、使用環境 office word 365,文件格式為.docx 圖片格式為.PNG 2、創建 .dotm 加載項文件 打開 Word,新建一個空白文檔。 按下 Alt F11 打開 VBA 編輯器。 點擊菜單欄&#xff…

深度學習的下一個突破:從圖像識別到情境理解

引言 過去十年,深度學習在圖像識別領域取得了驚人的突破。從2012年ImageNet大賽上的AlexNet,到后來的ResNet、EfficientNet,再到近年來Transformer架構的崛起,AI已經能在許多任務上超越人類,比如人臉識別、目標檢測、醫…

使用dyn4j做碰撞檢測

文章目錄 前言一、環境準備添加依賴基本概念 二、實現步驟1.創建世界2.添加物體3.設置碰撞監聽器4.更新世界 三、完整代碼示例四、優化補充總結 前言 dyn4j 提供了高效的碰撞檢測和物理模擬功能,適用于游戲開發、動畫制作以及其他需要物理交互的場景。通過簡單的 A…

VS Code settings.json 文件中常用的預定義變量?及其用途說明

VS Code settings.json 常用預定義變量 以下是 Visual Studio Code 配置文件中常用的預定義變量列表: 1. 工作區相關變量 變量描述示例值${workspaceFolder}當前工作區根目錄的絕對路徑C:/projects/my-project${workspaceFolderBasename}工作區文件夾名稱&#x…

elasticSearch-搜索引擎

搜索引擎的優勢 有了數據庫分頁查詢,為什么還需要搜索引擎? 搜索引擎速度上很快數據庫分頁查詢,隨著數據庫數據量增大,頁數靠后,會導致搜索速度變慢,但是搜索引擎不會搜索引擎支持分詞查詢,地…

安裝OpenJDK1.8 17 (macos M芯片)

安裝OpenJDK 1.8 下載完后,解壓,打開 環境變量的配置文件即可 vim ~/.zshrc #export JAVA_HOME/Users/xxxxx/jdk-21.jdk/Contents/Home #export JAVA_HOME/Users/xxxxx/jdk-17.jdk/Contents/Home #export JAVA_HOME/Users/xxxxx/jdk-11.jdk/Contents…

斷言與反射——以golang為例

斷言 x.(T) 檢查x的動態類型是否是T,其中x必須是接口值。 簡單使用 func main() {var x interface{}x 100value1, ok : x.(int)if ok {fmt.Println(value1)}value2, ok : x.(string)if ok {//未打印fmt.Println(value2)} }需要注意如果不接受第二個參數就是OK,這…