curl_cffi 快速入门指南:Python HTTP客户端库详解
项目概述
curl_cffi 是一个基于 libcurl 的 Python HTTP 客户端库,它通过 cffi 绑定提供了对 curl-impersonate 的支持。这个库特别适合需要模拟浏览器 TLS 指纹的场景,能够有效解决反爬虫机制中的 TLS 指纹检测问题。
安装指南
系统要求
- 仅支持 Python 3.9 及以上版本
- Python 3.8 已不再维护,不再支持
安装方法
标准安装方式:
pip install curl_cffi --upgrade
PyPI 上提供了源代码分发(sdist)和二进制分发(bdist)两种形式,支持 Linux、macOS 和 Windows 系统。
安装测试版:
pip install curl_cffi --upgrade --pre
基本使用
发起GET请求
import curl_cffi
# 使用chrome110的TLS指纹
r = curl_cffi.get("https://tls.browserleaks.com/json", impersonate="chrome110")
# 使用最新版Chrome指纹
r = curl_cffi.get("https://tls.browserleaks.com/json", impersonate="chrome")
# 使用代理
proxies = {"https": "http://localhost:3128"}
r = curl_cffi.get("https://example.com", impersonate="chrome110", proxies=proxies)
URL参数处理
params = {'key1': 'value1', 'key2': ['value2', 'value3']}
r = curl_cffi.get('https://httpbin.org/get', params=params)
print(r.url) # 输出完整的带参URL
请求头控制
headers = {"User-Agent": "custom-user-agent"}
r = curl_cffi.get("http://example.com", headers=headers)
# 禁用默认头
r = curl_cffi.get("https://example.com", impersonate="chrome", default_headers=False)
响应处理
读取响应内容
r = curl_cffi.get("https://example.com")
# 二进制内容
print(r.content)
# 解码后的文本
print(r.text)
# JSON响应
print(r.json())
响应状态码
r = curl_cffi.get("https://httpbin.org/status/404")
print(r.status_code) # 404
r.raise_for_status() # 抛出HTTPError异常
响应头
print(r.headers["content-type"]) # 不区分大小写
高级请求方法
POST请求
# 表单提交
r = curl_cffi.post("https://httpbin.org/post", data={"name": "Luke"})
# 二进制数据
r = curl_cffi.post("https://httpbin.org/post", data=b"binary data")
# JSON数据
r = curl_cffi.post("https://httpbin.org/post", json={"key": "value"})
文件上传
mp = curl_cffi.CurlMime()
mp.addpart(
name="attachment",
content_type="image/png",
filename="image.png",
local_path="./image.png"
)
r = curl_cffi.post("https://httpbin.org/post", multipart=mp)
会话管理
使用Session
with curl_cffi.Session() as s:
# 自动保存cookies
s.get("https://httpbin.org/cookies/set/foo/bar")
r = s.get("https://httpbin.org/cookies")
print(r.json()) # 显示已保存的cookies
异步请求
async with curl_cffi.AsyncSession() as s:
r = await s.get("https://example.com")
WebSocket支持
def on_message(ws, message):
print(message)
with curl_cffi.Session() as s:
ws = s.ws_connect("wss://echo.websocket.org", on_message=on_message)
ws.run_forever()
最佳实践
- 始终使用Session:Session可以复用连接和保持cookies,提高性能
- 合理使用impersonate参数:模拟浏览器指纹时选择适当的浏览器版本
- 异步处理高并发:对于大量请求,使用AsyncSession提高效率
- 注意流式响应:处理大文件时使用流式API避免内存问题
curl_cffi 提供了强大的HTTP客户端功能,特别适合需要处理复杂网络请求和反爬机制的场景。通过合理使用其特性,可以构建稳定高效的网络请求处理流程。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考