为什么开发者总在把 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++ 为复制模式。
常见问题
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,生成的代码贴进去可以直接跑通,适合先验证逻辑再落到本地项目。