如何使用Python的curl-cffi实现Multipart/Form-Data登录POST请求
用curl-cffi实现Multipart/Form-Data登录(匹配requests成功逻辑)
下面是和你requests代码逻辑完全对齐的curl-cffi实现,可解决登录失败问题。需要注意curl-cffi的会话管理、请求构造细节,尤其是UA头设置(部分网站会校验用户代理):
from curl_cffi import requests from html.parser import HTMLParser class CSRFTokenScraper(HTMLParser): def __init__(self): super().__init__() self.csrf_token = [] def handle_starttag(self, tag, attrs): if tag == 'input': attrs_dict = dict(attrs) if attrs_dict.get('name') == 'csrf_token': self.csrf_token.append(attrs_dict.get('value')) class Session: def __init__(self, login_url, username, password, timeout=10): self.login_url = login_url self.username = username self.password = password self.timeout = timeout # 初始化curl-cffi会话,自动保持cookie self.session = requests.Session() self.session.verify = False # 设置常见浏览器UA,避免网站拦截 self.session.headers.update({ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' }) self.csrf_token_scraper = CSRFTokenScraper() def login(self): # 步骤1:访问登录页提取CSRF token token_response = self.session.get(self.login_url, timeout=self.timeout) self.csrf_token_scraper.feed(token_response.text) csrf_token = self.csrf_token_scraper.csrf_token[0] # 步骤2:构造Multipart/Form-Data payload,格式与requests一致 files = { 'csrf_token': (None, csrf_token), 'username': (None, self.username), 'password': (None, self.password), } # 步骤3:发送POST请求,携带Referer头 headers = { 'Referer': self.login_url, } response = self.session.post( self.login_url, files=files, headers=headers, timeout=self.timeout ) return response if __name__ == "__main__": URL = "你的登录URL" USER = "你的用户名" PWD = "你的密码" session = Session(login_url=URL, username=USER, password=PWD) login_response = session.login() print(f"状态码: {login_response.status_code}") print(f"响应内容片段: {login_response.text[:500]}")
关键注意点
- 会话保持:必须用curl-cffi的
requests.Session()管理cookie,确保GET登录页的会话信息能传递到POST请求。 - UA头设置:curl-cffi默认UA与requests不同,部分网站会通过UA拦截请求,设置常见浏览器UA可规避该问题。
- Multipart格式:curl-cffi的
files参数格式与requests完全兼容,(None, 值)表示该字段为普通表单字段,会自动生成正确的Multipart边界和格式。 - 证书验证:
verify=False仅用于测试环境,生产环境建议开启证书验证。
如果仍失败,可排查:
- 查看响应内容是否有明确错误提示(如CSRF无效、账号密码错误等)。
- 对比requests和curl-cffi的请求头,确保必要字段一致。
- 检查登录页是否有其他隐藏表单字段,需一并加入
files中提交。
内容的提问来源于stack exchange,提问作者kyrlon
相关产品推荐
相关产品推荐

