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++ 为复制模式。

常见问题

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,生成的代码贴进去可以直接跑通,适合先验证逻辑再落到本地项目。