分步将 cURL 转换为 Python Requests
你从浏览器的开发者工具(DevTools)中将请求复制为 cURL 命令。
你得到了请求头(headers)、Cookie 和身份验证令牌(auth tokens)。
但最后你得到的是 30 行杂乱无章的 Shell 代码。而你想要的是简洁的 Python 代码。
以下是如何手动将 cURL 命令映射到 Python requests 库的方法。
确定请求方法 如果你看到
--data或--data-raw,curl 默认使用 POST。不要因为缺少-X标志就假设它是 GET 请求。处理请求头 (Headers) 每个
-H标志都会变成字典中的一个条目。 当你拆分请求头字符串时,仅在第一个冒号处进行拆分。 像 URL 或时间戳这样的值包含冒号。如果你在每个冒号处都进行拆分,将会破坏数据。管理 Cookie
-b标志提供的是以分号分隔的字符串。 不要将其放入你的headers字典中。 相反,应将其作为字典传递给cookies参数。这样可以让库来处理编码。使用 JSON 还是 Data 这是一个常见的错误。 如果内容类型(content type)是
application/json,请使用json=参数。 这会自动序列化你的字典并为你设置正确的请求头。 如果你使用data=,requests将使用表单编码(form-encoding)。这会导致 API 拒绝你的请求。清理参数 将 URL 中的查询字符串(query string)移动到
params字典中。 这会让你的代码更具可读性。 注意避免二次编码(double-encoding)。如果 URL 已经过编码,请不要在字典中再次对其进行编码。
最终的代码结构如下:
import requests
url = "https://api.example.com/v2/search"
params = {"lang": "en", "page": "2"}
headers = {
"accept": "application/json",
"authorization": "Bearer token_here",
"referer": "https://app.example.com/dashboard",
}
cookies = {"session": "abc123"}
payload = {"q": "nginx"}
resp = requests.post(
url,
params=params,
headers=headers,
cookies=cookies,
json=payload,
)
resp.raise_for_status()
print(resp.json())
需要避免的常见陷阱:
- 在进行 multipart 上传时,混淆了
files=和data=。 - 在每个冒号处拆分请求头。
- 对查询参数进行二次编码。
来源:https://dev.to/wanfeng/from-browser-curl-to-clean-python-requests-code-step-by-step-25oh