DevTool 團隊

curl 轉 Python requests 完整指南:命令逐段對照與線上轉換實戰

拿到一條 curl 命令怎麼變成 Python requests 程式碼?這篇按旗標逐段講對照關係:-H 進 headers、-d 進 data、-u 變 Authorization、-G 挪查詢串,JSON 請求、Cookie 會話、爬蟲場景各給一例,最後用線上工具一鍵轉換並直接執行驗證。

為什麼開發者總在把 curl 轉 Python

瀏覽器 DevTools 裡右鍵請求選「Copy as cURL」,拿到的是一條完整命令:URL、請求標頭、請求體、Cookie 全在裡面。下一步往往是用 Python 重現這個請求——寫爬蟲、調介面、做自動化驗證。手翻並不難,但旗標一多就容易漏:漏一個 -H 請求就是 401,漏一個 --data-raw 方法就變 GET。

對照關係本身是機械的,這正是工具該幹的活:curl 命令轉換器把命令貼進去,選 Python 目標,requests 程式碼即時產生,還能一鍵送進 Python 線上執行器當場執行。

逐段對照:curl 旗標到 requests 參數

先用一條典型命令建立整體印象:

curl 'https://api.example.com/v1/users' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer demo-token' \
  --data-raw '{"name":"Ada","role":"admin"}'

轉換後的 Python 程式碼:

import requests

url = "https://api.example.com/v1/users"
headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer demo-token",
}
data = '{"name":"Ada","role":"admin"}'

response = requests.post(url, headers=headers, data=data, allow_redirects=False)
print(response.status_code)
print(response.text)

各旗標的落點一張表說清:

curl 寫法 requests 落點 說明
URL(首個參數) url 引號原樣保留
-H '名字: 值' headers 字典逐條 同名標頭後寫覆蓋先寫
-d / --data-raw data 字串 多次 -d 用 & 串接
-X POST requests.post 有 -d 無 -X 時自動推斷 POST
-u user:pass auth=(user, pass) 也可手寫 Authorization Basic 標頭
-b 'k=v' headers 裡的 Cookie 會話場景建議 Session
-G data 挪進 URL 查詢串 方法回落 GET
-k verify=False 僅測試環境用
-L 預設跟隨(不寫 allow_redirects=False) curl 預設不跟隨,requests 預設跟隨
-A 'UA/1.0' / -e 'url' User-Agent / Referer 標頭 curl 語義就是設標頭

一個容易踩的差異:curl 有請求體但沒寫 Content-Type 時,預設按 application/x-www-form-urlencoded 傳送。靠譜的轉換器會幫你把這個標頭補上(curlconverter.com 與本站工具都會),否則服務端可能按純文字解析導致 400。

JSON 請求:data 與 json 參數的取捨

從 --data-raw '{"name":"Ada"}' 直接轉出來的是字串形式。想用 requests 的 json 參數,把字串解析成字典再傳:

import json

payload = {"name": "Ada", "role": "admin"}
response = requests.post(url, headers=headers, json=payload)

json=payload 會自動序列化並補 Content-Type: application/json。兩種寫法線上行為一致,選哪個看團隊習慣——改介面除錯時字串形式改動小,寫業務程式碼時字典形式更可讀。

curl 的 -b 'session=xyz' 轉出來是一個 Cookie 標頭,單次請求夠用。但如果後續還要請求同站的其他介面,手工維護 Cookie 會瘋掉——requests 的 Session 會自動接住回應裡的 Set-Cookie:

session = requests.Session()
session.headers.update({"User-Agent": "MyApp/1.0"})

login = session.post("https://api.example.com/login", data={"user": "ada", "pass": "***"})
profile = session.get("https://api.example.com/me")  # 登入狀態自動帶上

爬蟲場景的典型鏈路就是:DevTools 抄登入請求 → 轉 Python → 改成 Session → 迴圈翻頁。每一步的對照關係都在上面的表裡。

轉換工具怎麼選

三個實際標準:

  1. 旗標覆蓋:-H/-d/--data-raw/--json/-u/-b/-G/-L/-k 與組合短旗標(-sSL)、多行續行是高頻集,缺一個就得手補。
  2. 錯誤回饋:命令貼錯時,能指出問題出在哪個旗標的工具能省一半排查時間;只彈「解析失敗」的要差一檔。
  3. 轉換之後的動線:產生的程式碼能不能直接跑?本站的 curl 轉換器轉出的 Python 程式碼可以一鍵送進線上執行器(requests 已內建),當場看到狀態碼和回應體;Go、Java 兩個目標同樣支援,PHP 與 C++ 為複製模式。

Frequently Asked Questions

curl 命令怎麼轉成 Python requests 程式碼?

手工對照三步:URL 給 requests 的第一個參數;-H 的「名字: 值」逐條進 headers 字典;-d/--data-raw 的內容進 data 字串,方法用 requests.post(curl 有 -d 無 -X 時就是 POST)。用線上轉換工具可以跳過手工:貼上命令選 Python 目標,程式碼即時產生,還能一鍵送進線上執行器執行驗證。

curl 的 JSON 請求轉 Python 時 data 和 json 參數用哪個?

兩個都能發 JSON。用 data 時要自己保證字串是合法 JSON 並帶 Content-Type: application/json 標頭;用 json 參數傳字典時 requests 會自動序列化並補標頭。從 curl -d 或 --json 轉換時,先得到的是字串形式(data),確認結構後再改成 json 參數更穩。

curl 的 -b 和 -u 轉 Python 後對應什麼?

-b "name=value" 會轉成 Cookie 請求標頭進 headers;帶 Cookie 的會話建議改用 requests.Session() 保持登入狀態。-u user:pass 對應 auth=("user", "pass") 參數,requests 會自動產生 Authorization Basic 標頭,不用手寫 Base64。

轉出來的 Python 程式碼提示找不到 requests 模組怎麼辦?

requests 是第三方庫,先 pip install requests 再執行。線上執行環境(如本站 Python 執行器)已內建 requests,產生的程式碼貼進去可以直接跑通,適合先驗證邏輯再落到本地專案。