為什麼開發者總在把 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。兩種寫法線上行為一致,選哪個看團隊習慣——改介面除錯時字串形式改動小,寫業務程式碼時字典形式更可讀。
Cookie 與登入狀態:Session 才是正解
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 → 迴圈翻頁。每一步的對照關係都在上面的表裡。
轉換工具怎麼選
三個實際標準:
- 旗標覆蓋:-H/-d/--data-raw/--json/-u/-b/-G/-L/-k 與組合短旗標(-sSL)、多行續行是高頻集,缺一個就得手補。
- 錯誤回饋:命令貼錯時,能指出問題出在哪個旗標的工具能省一半排查時間;只彈「解析失敗」的要差一檔。
- 轉換之後的動線:產生的程式碼能不能直接跑?本站的 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,產生的程式碼貼進去可以直接跑通,適合先驗證邏輯再落到本地專案。