分步将 cURL 转换为 Python Requests

你从浏览器的开发者工具(DevTools)中将请求复制为 cURL 命令。

你得到了请求头(headers)、Cookie 和身份验证令牌(auth tokens)。

但最后你得到的是 30 行杂乱无章的 Shell 代码。而你想要的是简洁的 Python 代码。

以下是如何手动将 cURL 命令映射到 Python requests 库的方法。

  1. 确定请求方法 如果你看到 --data--data-raw,curl 默认使用 POST。不要因为缺少 -X 标志就假设它是 GET 请求。

  2. 处理请求头 (Headers) 每个 -H 标志都会变成字典中的一个条目。 当你拆分请求头字符串时,仅在第一个冒号处进行拆分。 像 URL 或时间戳这样的值包含冒号。如果你在每个冒号处都进行拆分,将会破坏数据。

  3. 管理 Cookie -b 标志提供的是以分号分隔的字符串。 不要将其放入你的 headers 字典中。 相反,应将其作为字典传递给 cookies 参数。这样可以让库来处理编码。

  4. 使用 JSON 还是 Data 这是一个常见的错误。 如果内容类型(content type)是 application/json,请使用 json= 参数。 这会自动序列化你的字典并为你设置正确的请求头。 如果你使用 data=requests 将使用表单编码(form-encoding)。这会导致 API 拒绝你的请求。

  5. 清理参数 将 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