Curl 命令转 Python:入门指南
在软件开发、API 测试、数据抓取等众多领域,我们经常需要与网络服务进行交互,发送 HTTP 请求并处理响应。curl
是一个强大的命令行工具,因其简洁和灵活性而广受欢迎。开发者们常常使用 curl
来快速测试 API 端点、调试网络问题或进行简单的数据下载。
然而,在构建自动化脚本、集成到应用程序流程或处理复杂的逻辑时,直接使用 curl
命令会变得困难且不够灵活。这时,将 curl
的功能迁移到编程语言中就显得尤为重要。Python 作为一种功能强大且易于学习的语言,拥有丰富的 HTTP 库,使其成为实现这一目标的绝佳选择。
本文将深入探讨如何将常用的 curl
命令及其各种选项转换为等效的 Python 代码。我们将重点介绍 Python 中处理 HTTP 请求的两个主要库:标准库 urllib.request
和第三方库 requests
。通过详细的示例和解释,你将掌握如何将你在 curl
中熟悉的各种操作,如设置请求方法、添加头部、发送数据、处理认证和代理等,用 Python 代码实现。
为什么将 Curl 转为 Python?
尽管 curl
在命令行环境中表现出色,但在以下场景中,使用 Python 实现 HTTP 请求具有显著优势:
- 自动化与集成: 将网络请求嵌入到更复杂的自动化脚本、工作流程或大型应用程序中,而不是手动执行命令行。
- 逻辑控制: 根据请求结果进行条件判断、循环发送请求、处理复杂的业务逻辑。
- 数据处理: 方便地解析和处理返回的数据(如 JSON、XML),进行数据清洗、存储或进一步分析。
- 错误处理: 优雅地捕获和处理各种网络错误、HTTP 状态码错误,提高程序的健壮性。
- 代码维护: 将请求逻辑作为代码的一部分进行版本控制、重用和维护,而不是零散的命令行脚本。
- 更友好的接口: Python 的 HTTP 库通常提供更直观、更高级的 API,简化了许多底层细节。
Python 中的 HTTP 库
Python 提供了多种处理 HTTP 请求的库。最常用的有两个:
urllib.request
: 这是 Python 的标准库,无需额外安装即可使用。它提供了基本的 HTTP 客户端功能,但接口相对底层,对于复杂任务可能略显繁琐。requests
: 这是一个广受欢迎的第三方库,被誉为“Human-friendly HTTP Library”。它提供了简洁、直观的 API,极大地简化了 HTTP 请求的发送和响应的处理。在绝大多数非极端性能要求的场景下,requests
是进行 HTTP 请求的首选库。 本文将主要聚焦于requests
库,因为它更贴近日常开发的需求,且与curl
的使用习惯更容易对应。
在开始之前,请确保你的 Python 环境中安装了 requests
库:
bash
pip install requests
Curl 命令与 Python Requests 的映射关系
curl
命令的结构通常是 curl [options] <URL>
。这些 options
对应着 HTTP 请求的各个组成部分。Python requests
库的方法(如 requests.get()
, requests.post()
等)和参数则提供了设置这些组成部分的方式。
一个 HTTP 请求的核心要素包括:
- URL (Uniform Resource Locator): 资源的地址。
- Method (请求方法): 如 GET、POST、PUT、DELETE 等。
- Headers (头部): 包含关于请求的元数据,如
Content-Type
,User-Agent
,Authorization
,Cookie
等。 - Body (请求体): 对于 POST、PUT 等方法,可能包含发送给服务器的数据。
- Parameters (查询参数): URL 中
?
后面的键值对数据,通常用于 GET 请求。
接下来,我们将通过具体的 curl
示例,展示如何将其转换为 requests
代码。
1. 基本 GET 请求
最简单的 curl
命令是获取一个 URL 的内容:
bash
curl https://www.example.com
这会向 https://www.example.com
发送一个 GET 请求,并打印响应体。在 Python 中,使用 requests.get()
可以轻松实现:
“`python
import requests
url = “https://www.example.com”
try:
response = requests.get(url)
# 检查响应状态码
response.raise_for_status() # 如果状态码不是 2xx,则抛出异常
# 打印响应体
print(response.text)
except requests.exceptions.RequestException as e:
print(f”请求发生错误: {e}”)
“`
requests.get(url)
发送一个 GET 请求到指定的 URL。response
对象包含了服务器的响应信息。response.raise_for_status()
是一个非常实用的方法,它会检查 HTTP 状态码。如果状态码表示请求失败(4xx 或 5xx),它会抛出一个HTTPError
异常。response.text
属性获取响应体的内容,解码为文本。
2. 指定请求方法 (-X
)
curl
使用 -X
选项指定请求方法,例如 POST:
bash
curl -X POST https://api.example.com/resource
在 requests
中,直接调用对应的方法即可:
“`python
import requests
url = “https://api.example.com/resource”
try:
response = requests.post(url)
response.raise_for_status()
print(response.text)
except requests.exceptions.RequestException as e:
print(f”POST 请求发生错误: {e}”)
“`
requests
提供了与常见 HTTP 方法对应的方法:requests.get()
, requests.post()
, requests.put()
, requests.delete()
, requests.patch()
, requests.head()
, requests.options()
。
如果你需要更灵活地指定方法(例如,方法的名称来自变量),可以使用 requests.request()
方法:
“`python
import requests
method = “PUT”
url = “https://api.example.com/resource/123”
try:
response = requests.request(method, url)
response.raise_for_status()
print(response.text)
except requests.exceptions.RequestException as e:
print(f”{method} 请求发生错误: {e}”)
“`
3. 发送查询参数 (-G
, URL 中的 ?
)
curl
可以直接在 URL 中包含查询参数,或者使用 -G
选项将 -d
选项提供的数据作为查询参数(GET 请求):
“`bash
直接在 URL 中
curl “https://api.example.com/search?query=test&page=1”
使用 -G 选项
curl -G “https://api.example.com/search” -d “query=test” -d “page=1”
“`
在 requests
中,推荐使用 params
参数,它接受一个字典或字节列表。requests
会自动帮你构建正确的 URL,包括编码参数:
“`python
import requests
url = “https://api.example.com/search”
parameters = {
“query”: “test”,
“page”: 1
}
try:
response = requests.get(url, params=parameters)
response.raise_for_status()
# 打印实际请求的 URL (包含编码后的参数)
print(f"实际请求的 URL: {response.url}")
print(response.text)
except requests.exceptions.RequestException as e:
print(f”请求发生错误: {e}”)
“`
4. 发送请求体数据 (-d
, --data
, --data-raw
, --data-urlencode
)
对于 POST、PUT 等请求,我们通常需要发送数据体。curl
提供了 -d
、--data-raw
等选项。
发送 URL 编码的表单数据:
“`bash
curl -X POST https://api.example.com/login -d “username=user&password=pass”
或者使用多个 -d,curl 会自动合并并添加 Content-Type: application/x-www-form-urlencoded
curl -X POST https://api.example.com/login -d “username=user” -d “password=pass”
“`
requests
的 data
参数可以接受一个字典。当 data
是一个字典时,requests
会默认使用 application/x-www-form-urlencoded
编码数据,并自动设置 Content-Type
头部。
“`python
import requests
url = “https://api.example.com/login”
payload = {
“username”: “user”,
“password”: “pass”
}
try:
# requests 会自动设置 Content-Type 为 application/x-www-form-urlencoded
response = requests.post(url, data=payload)
response.raise_for_status()
print(response.text)
except requests.exceptions.RequestException as e:
print(f”POST 请求发生错误: {e}”)
“`
发送原始数据 (如 JSON 或 XML):
curl
使用 -d
或 --data-raw
发送原始字符串。如果发送 JSON,通常还需要手动设置 Content-Type: application/json
头部:
bash
curl -X POST https://api.example.com/items -H "Content-Type: application/json" -d '{"name": "New Item", "price": 10.0}'
requests
的 data
参数也可以接受字符串或字节。更方便的是,如果你要发送 JSON 数据,可以直接使用 json
参数,它接受一个 Python 字典或列表。requests
会自动将其序列化为 JSON 字符串,并设置 Content-Type: application/json
头部。
“`python
import requests
import json # 如果需要手动构造 JSON 字符串
url = “https://api.example.com/items”
使用 json 参数发送 Python 字典
payload_dict = {
“name”: “New Item”,
“price”: 10.0
}
或者手动构造 JSON 字符串(不推荐,直接用 json 参数更方便)
payload_json_string = json.dumps(payload_dict)
try:
# 使用 json 参数,requests 会自动设置 Content-Type: application/json
response = requests.post(url, json=payload_dict)
response.raise_for_status()
print(response.text)
# 如果服务器返回 JSON,可以使用 .json() 方法解析
# data = response.json()
# print(data)
except requests.exceptions.RequestException as e:
print(f”POST 请求发生错误: {e}”)
except json.JSONDecodeError:
print(“无法解析响应体为 JSON”)
“`
发送 URL 编码但不需要 Content-Type
头部(不常见):
如果 -d
后面跟着 @filename
,curl 会读取文件内容作为数据体。这通常用于发送大型或二进制数据。
bash
curl -X POST https://api.example.com/upload -d @/path/to/local/file.txt
对于发送文件,请看下一节关于 multipart/form-data
的示例。如果只是发送文件内容作为原始请求体,可以将文件读取到字符串或字节,然后作为 data
参数的值。
“`python
import requests
url = “https://api.example.com/upload”
file_path = “/path/to/local/file.txt”
try:
with open(file_path, ‘rb’) as f: # 使用 ‘rb’ 以二进制模式读取
file_content = f.read()
response = requests.post(url, data=file_content)
response.raise_for_status()
print(response.text)
except FileNotFoundError:
print(f”文件未找到: {file_path}”)
except requests.exceptions.RequestException as e:
print(f”POST 请求发生错误: {e}”)
“`
5. 发送 multipart/form-data (-F
)
curl -F
常用于模拟 HTML 表单提交,包括文件上传:
“`bash
发送普通字段
curl -X POST https://api.example.com/submit -F “name=Alice” -F “age=30”
上传文件
curl -X POST https://api.example.com/upload -F “file=@/path/to/local/image.jpg”
上传文件并指定文件名和 Content-Type (不太常用,curl通常自动处理)
curl -X POST https://api.example.com/upload -F “file=@/path/to/local/image.jpg;filename=my_image.jpeg;type=image/jpeg”
同时发送字段和文件
curl -X POST https://api.example.com/profile -F “username=Bob” -F “avatar=@/path/to/local/avatar.png”
“`
requests
使用 files
参数来处理 multipart/form-data
请求。files
参数接受一个字典,字典的值可以是文件对象、(文件名, 文件内容)
元组、(文件名, 文件内容, Content-Type)
元组,或者 (文件名, 文件内容, Content-Type, Headers)
元组。
“`python
import requests
url = “https://api.example.com/profile”
准备普通字段数据
data = {
“username”: “Bob”,
“age”: “25”
}
准备文件数据
file_path = “/path/to/local/avatar.png”
file_name = “avatar.png” # 或者可以自定义文件名
file_field_name = “avatar” # 表单中的文件字段名
打开文件并准备 files 字典
try:
# 方式一:使用文件对象 (推荐,requests 会自动处理大部分细节)
with open(file_path, ‘rb’) as f:
files = {
file_field_name: f # requests 会从文件对象猜测文件名和 Content-Type
# 或者更明确地指定文件名和 Content-Type:
# file_field_name: (file_name, f, ‘image/png’)
}
# 同时发送普通字段和文件
response = requests.post(url, data=data, files=files)
response.raise_for_status()
print(response.text)
except FileNotFoundError:
print(f”文件未找到: {file_path}”)
except requests.exceptions.RequestException as e:
print(f”POST (multipart) 请求发生错误: {e}”)
方式二:直接提供文件内容 (如果文件不大)
try:
with open(file_path, ‘rb’) as f:
file_content = f.read()
files = {
file_field_name: (file_name, file_content, ‘image/png’) # 需要手动指定文件名和 Content-Type
}
response = requests.post(url, data=data, files=files)
response.raise_for_status()
print(response.text)
except FileNotFoundError:
print(f”文件未找到: {file_path}”)
except requests.exceptions.RequestException as e:
print(f”POST (multipart) 请求发生错误: {e}”)
“`
6. 添加自定义头部 (-H
)
curl -H
用于添加或修改请求头部:
bash
curl -H "User-Agent: MyCustomClient/1.0" -H "X-API-Key: abcdef12345" https://api.example.com/data
requests
使用 headers
参数,它接受一个字典:
“`python
import requests
url = “https://api.example.com/data”
custom_headers = {
“User-Agent”: “MyCustomClient/1.0”,
“X-API-Key”: “abcdef12345”
}
try:
response = requests.get(url, headers=custom_headers)
response.raise_for_status()
print(response.text)
except requests.exceptions.RequestException as e:
print(f”请求发生错误: {e}”)
“`
注意: 有些标准头部(如 Content-Type
, Content-Length
, Host
, User-Agent
)requests
会根据请求方法和数据自动设置。如果你在 headers
字典中提供了这些头部,它们会覆盖 requests
的默认设置。
7. 基本认证 (-u
)
curl -u
用于发送 Basic Authentication 头部:
bash
curl -u "username:password" https://api.example.com/secure
requests
使用 auth
参数,它接受一个包含用户名和密码的元组:
“`python
import requests
url = “https://api.example.com/secure”
username = “username”
password = “password”
try:
response = requests.get(url, auth=(username, password))
response.raise_for_status()
print(response.text)
except requests.exceptions.RequestException as e:
print(f”认证请求发生错误: {e}”)
“`
requests
也支持其他认证方式,如 OAuth,可以通过安装额外的包并配合 auth
参数来实现。
8. 处理 Cookies (-b
, -c
)
curl -b
用于发送 cookie,-c
用于将会话中的 cookie 保存到文件:
“`bash
发送 cookie
curl -b “sessionid=abc123; othercookie=xyz456” https://www.example.com/profile
从文件读取 cookie 并发送
curl -b cookies.txt https://www.example.com/profile
将响应中的 cookie 保存到文件
curl -c cookies.txt https://www.example.com/login -d “user=…”
“`
requests
使用 cookies
参数发送 cookie,它接受一个字典。更重要的是,requests.Session
对象可以自动管理 cookie,使其在同一个会话内的请求中持久化。这是模拟用户登录会话等场景的标准做法。
“`python
import requests
url_login = “https://www.example.com/login”
url_profile = “https://www.example.com/profile”
方式一:手动发送 cookie (通常用于发送已知 cookie,如从其他地方获取)
cookies_to_send = {
“sessionid”: “abc123”,
“othercookie”: “xyz456”
}
try:
response = requests.get(url_profile, cookies=cookies_to_send)
response.raise_for_status()
print(response.text)
except requests.exceptions.RequestException as e:
print(f”请求发生错误: {e}”)
方式二:使用 Session 对象自动管理 cookie (推荐)
with requests.Session() as session:
# 第一次请求(例如登录),服务器可能设置 cookie
login_data = {
“user”: “testuser”,
“password”: “mypassword”
}
try:
print(“正在进行登录请求…”)
response_login = session.post(url_login, data=login_data)
response_login.raise_for_status()
print(“登录成功,cookies 已自动保存到 session”)
# 查看 session 中当前的 cookie (可选)
print("当前 session 中的 cookies:")
for cookie in session.cookies:
print(f"- {cookie.name}: {cookie.value}")
# 第二次请求(访问需要认证的页面),session 会自动带上之前获取的 cookie
print("\n正在访问需要 cookie 的页面...")
response_profile = session.get(url_profile)
response_profile.raise_for_status()
print("成功访问个人资料页面:")
print(response_profile.text)
except requests.exceptions.RequestException as e:
print(f"请求发生错误: {e}")
“`
使用 requests.Session
是模拟用户行为(如登录后访问其他页面)的最佳实践,它不仅管理 cookie,还可以提高性能(连接池复用)并允许为整个会话设置默认头部等。
9. 跟随重定向 (-L
)
curl -L
会让 curl 遵循 HTTP 3xx 重定向。
bash
curl -L http://shorturl.at/abcde
requests
默认是跟随重定向的(allow_redirects=True
)。如果你想禁用重定向,可以设置该参数为 False
:
“`python
import requests
url = “http://shorturl.at/abcde”
try:
# 默认行为 (allow_redirects=True)
response = requests.get(url)
print(f”最终 URL (默认重定向): {response.url}”)
response.raise_for_status()
print(response.text)
print("-" * 20)
# 禁用重定向
response_no_redirect = requests.get(url, allow_redirects=False)
print(f"响应状态码 (禁用重定向): {response_no_redirect.status_code}")
# 可以通过 response_no_redirect.headers['Location'] 获取重定向的目标 URL
if 'Location' in response_no_redirect.headers:
print(f"重定向目标: {response_no_redirect.headers['Location']}")
except requests.exceptions.RequestException as e:
print(f”请求发生错误: {e}”)
“`
10. 忽略 SSL 证书错误 (-k
, --insecure
)
curl -k
或 --insecure
会禁用证书验证。这在生产环境中非常不安全,仅用于开发或测试不信任的证书。
bash
curl -k https://untrusted-cert.example.com
requests
使用 verify
参数来控制证书验证。默认是 True
(验证证书)。设置为 False
会禁用验证:
“`python
import requests
url = “https://untrusted-cert.example.com” # 替换为实际的有证书问题的 URL
WARNING: Setting verify to False is insecure.
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # 通常建议禁用警告
try:
# !!! SECURITY WARNING: Do not do this in production !!!
response = requests.get(url, verify=False)
response.raise_for_status()
print(response.text)
except requests.exceptions.RequestException as e:
print(f”请求发生错误: {e}”)
“`
请务必理解 verify=False
的安全风险,并在非必要情况下避免使用。正确的做法是配置系统或 requests
来信任特定的证书或证书颁发机构。
11. 使用代理 (-x
, --proxy
)
curl -x
用于通过代理服务器发送请求:
bash
curl -x http://proxyserver:8080 https://www.example.com
curl -x socks5://user:pass@proxyserver:1080 https://www.example.com
requests
使用 proxies
参数,它接受一个字典,键是协议(http
或 https
),值是代理 URL:
“`python
import requests
url = “https://www.example.com”
proxies = {
“http”: “http://proxyserver:8080”,
“https”: “http://proxyserver:8080”, # HTTPS 请求也可以通过 HTTP 代理转发
# 如果代理需要认证
# “http”: “http://user:pass@proxyserver:8080”,
# “https”: “http://user:pass@proxyserver:8080”,
# 如果是 SOCKS 代理,需要安装 pysocks: pip install pysocks
# “http”: “socks5://user:pass@proxyserver:1080”,
# “https”: “socks5://user:pass@proxyserver:1080”,
}
try:
response = requests.get(url, proxies=proxies)
response.raise_for_status()
print(response.text)
except requests.exceptions.RequestException as e:
print(f”请求发生错误: {e}”)
“`
12. 设置超时 (--connect-timeout
, --max-time
)
curl
可以通过 --connect-timeout
设置连接超时时间,--max-time
设置总请求时间。
bash
curl --connect-timeout 5 --max-time 10 https://www.example.com
requests
使用 timeout
参数,它可以是单个值(作为连接超时和读取超时的总和)或一个元组 (connect_timeout, read_timeout)
:
“`python
import requests
url = “https://www.example.com”
try:
# 设置连接超时 5 秒,读取超时 10 秒
response = requests.get(url, timeout=(5, 10))
# 或者设置总超时 15 秒 (不区分连接和读取)
# response = requests.get(url, timeout=15)
response.raise_for_status()
print(response.text)
except requests.exceptions.Timeout:
print(“请求超时”)
except requests.exceptions.RequestException as e:
print(f”请求发生错误: {e}”)
“`
13. 自动解压缩 (--compressed
)
curl --compressed
会在请求头部添加 Accept-Encoding: gzip, deflate, br
,并自动解压缩响应体。
requests
默认就会发送包含 gzip, deflate
的 Accept-Encoding
头部,并且会自动解压缩响应体。无需额外操作。
14. 查看请求/响应详情 (-v
, --verbose
)
curl -v
会输出非常详细的请求和响应过程信息,包括头部、SSL 握手等。
在 requests
中,没有一个直接的参数可以完全复制 -v
的输出。但可以通过多种方式获取类似的信息:
- 查看请求头部和体: 在发送请求前,可以使用
requests.Request
和requests.Session().prepare()
方法构建请求对象,然后检查其属性。 - 查看响应头部和体: 响应对象 (
response
) 提供了response.request.headers
,response.headers
,response.text
,response.content
等属性。 - 查看重定向历史:
response.history
属性是一个列表,包含了所有重定向过程中的响应对象。 - 启用日志: 可以配置 Python 的
logging
模块来显示requests
库内部的调试信息。
示例 (查看请求和响应头部):
“`python
import requests
url = “https://www.example.com”
try:
response = requests.get(url)
response.raise_for_status()
print("--- 请求头部 ---")
# requests 会在发送请求前填充一些默认头部
# 要看 requests 实际发送的完整头部,可以使用 prepare()
# req = requests.Request('GET', url).prepare()
# print(req.headers) # 注意:prepare() 不会包含 requests 自动添加的一些动态头部
# requests 响应对象中包含了发送时的头部
print(response.request.headers)
print("\n--- 响应头部 ---")
print(response.headers)
print("\n--- 响应体 (截断前1000字符) ---")
print(response.text[:1000] + "...")
except requests.exceptions.RequestException as e:
print(f”请求发生错误: {e}”)
“`
总结 Responses 对象
requests
发送请求后返回的 Response
对象是核心,它提供了丰富的属性和方法来获取响应信息:
response.status_code
: HTTP 状态码(整数,如 200, 404, 500)。response.reason
: 状态码对应的文本描述(如 ‘OK’, ‘Not Found’)。response.text
: 响应体内容,已根据头部信息进行字符集解码。response.content
: 响应体内容,原始字节形式。适合处理非文本数据(如图片、文件)。response.json()
: 如果响应体是 JSON,将其解析为 Python 字典或列表。如果不是有效的 JSON,会抛出json.JSONDecodeError
。response.headers
: 响应头部字典。response.cookies
: 响应中设置的 cookie,是一个RequestsCookieJar
对象。response.url
: 最终请求的 URL(在发生重定向后很有用)。response.request
: 对应请求的PreparedRequest
对象。response.elapsed
: 从发送请求到接收完整头部所花费的时间(timedelta
对象)。response.raise_for_status()
: 如果状态码是 4xx 或 5xx,抛出requests.exceptions.HTTPError
。
错误处理
网络请求是不可靠的,可能会遇到各种问题:网络连接中断、超时、DNS 错误、SSL 错误、HTTP 错误状态码等。使用 try...except
块来捕获 requests
可能抛出的异常是至关重要的:
“`python
import requests
url = “http://invalid-url-or-offline.com”
try:
response = requests.get(url, timeout=5) # 设置超时是个好习惯
response.raise_for_status() # 检查 HTTP 状态码
# 请求成功,处理响应
print("请求成功!")
print(response.text)
except requests.exceptions.Timeout:
# 请求超时
print(“请求超时了!”)
except requests.exceptions.HTTPError as e:
# HTTP 状态码错误 (4xx, 5xx)
print(f”HTTP 错误发生: {e.response.status_code} – {e.response.reason}”)
except requests.exceptions.ConnectionError as e:
# 网络连接错误 (DNS 解析失败, 拒绝连接等)
print(f”连接错误发生: {e}”)
except requests.exceptions.RequestException as e:
# 其他 requests 相关的错误 (基类)
print(f”发生了其他 requests 错误: {e}”)
except Exception as e:
# 捕获所有其他可能的异常
print(f”发生未知错误: {e}”)
“`
捕获更具体的异常(如 Timeout
, HTTPError
, ConnectionError
)可以让你针对不同类型的错误执行不同的处理逻辑。requests.exceptions.RequestException
是所有 requests
相关异常的基类,可以捕获所有 requests
产生的错误。
使用在线 Curl 转 Python 工具
市面上有一些在线工具可以将 curl
命令直接转换为 Python (requests) 代码。例如:
这些工具非常方便,特别是对于包含复杂头部、数据或 cookie 的长 curl
命令。你可以将 curl
命令粘贴进去,它会为你生成相应的 Python 代码。
然而,依赖这些工具时需要注意:
- 理解代码: 不要盲目复制粘贴。生成的代码是理解
curl
选项如何在 Python 中实现的起点。你应该阅读并理解代码,根据需要进行修改和优化。 - 安全性: 如果你的
curl
命令包含敏感信息(如密码、API 密钥、bearer token、cookie),不要将它们粘贴到不受信任的在线工具中。最好手动转换包含敏感信息的命令。 - 复杂性: 对于非常复杂的
curl
命令或需要特定逻辑(如文件流式上传、异步请求等),在线工具可能无法生成完美的代码,或者生成的代码效率不高。
这些工具是学习和加速开发的辅助手段,但掌握手动转换的原理仍然是 essential 的。
总结与实践
将 curl
命令转换为 Python requests
代码是一个非常常见的任务,也是自动化和脚本编写的基础。通过本文的介绍,你应该对如何将 curl
的常用选项映射到 requests
的方法和参数有了清晰的认识:
- 请求方法 (
-X
) ->requests.get()
,requests.post()
, etc. 或requests.request(method, ...)
- URL -> 第一个参数
- 查询参数 (
-G
, URL?
) ->params
参数 (字典) - 表单数据 (
-d
) ->data
参数 (字典) - 原始/JSON 数据 (
-d
,--data-raw
) ->data
参数 (字符串/字节) 或json
参数 (字典/列表) - Multipart/form-data (
-F
) ->files
参数 (字典) - 头部 (
-H
) ->headers
参数 (字典) - 基本认证 (
-u
) ->auth
参数 (元组) - Cookies (
-b
,-c
) ->cookies
参数 (字典) 或使用requests.Session
- 跟随重定向 (
-L
) ->allow_redirects
参数 (默认为True
) - 忽略证书错误 (
-k
) ->verify
参数 (默认为True
) – 慎用! - 代理 (
-x
) ->proxies
参数 (字典) - 超时 (
--connect-timeout
,--max-time
) ->timeout
参数 (数值或元组)
实践建议:
- 从简单的
curl
命令开始转换,逐步增加选项的复杂度。 - 多使用
requests.Session
来处理需要维护状态(如 cookie)或批量发送请求的场景。 - 始终添加错误处理 (
try...except
),让你的代码更健壮。 - 对于生产环境的代码,仔细检查安全性相关的参数,特别是
verify=False
和代理设置。 - 利用
requests
提供的便利功能,例如使用json
参数发送 JSON 数据,让库自动处理序列化和头部设置。 - 当遇到不熟悉的
curl
选项时,查阅curl
的文档 (man curl
) 和requests
的文档,找到对应的实现方式。
掌握 curl
转 Python 的技能将极大地提升你在网络交互方面的能力,让你能够更高效、更灵活地处理各种 Web 相关的任务。祝你在 Python 的 HTTP 世界中探索顺利!