使用Requests POST登录网站返回400,如何获取_csrf-app参数?
这是典型的CSRF(跨站请求伪造)令牌验证问题——网站用这个参数确认请求来自合法的页面访问,而非恶意脚本。要解决这个问题,你需要先访问登录页面提取令牌,再带着它一起提交登录请求,具体步骤如下:
1. 先访问登录页面,获取CSRF令牌
网站的CSRF令牌通常嵌入在登录页面的表单里(一般是隐藏输入框),所以第一步要先用会话对象访问登录页面,拿到页面内容。这里一定要用requests.session()来保持会话,因为登录页面可能会设置必要的Cookie,后续提交请求时需要带上这些Cookie才能通过验证。
2. 解析页面提取_csrf-app参数
用HTML解析库(比如BeautifulSoup)定位到表单里的_csrf-app隐藏输入框,取出它的value值就是我们需要的令牌。
完整代码示例
import requests from bs4 import BeautifulSoup # 初始化会话,自动维护Cookie ssn = requests.session() # 1. 访问登录页面,获取包含CSRF令牌的页面内容 login_page_url = "https://www.fshare.vn/site/login" page_response = ssn.get(login_page_url) # 2. 解析HTML,提取_csrf-app令牌 soup = BeautifulSoup(page_response.text, 'html.parser') csrf_token = soup.find('input', {'name': '_csrf-app'})['value'] # 3. 准备完整的登录数据,加入CSRF令牌 login_data = { "_csrf-app": csrf_token, "LoginForm[email]": "gmail@gmail.com", "LoginForm[password]": "pw12345", "LoginForm[rememberMe]": 0 } # 4. 提交登录请求 login_response = ssn.post(login_page_url, data=login_data) # 验证登录结果(可以根据状态码或响应内容判断) print(f"登录请求状态码: {login_response.status_code}") # 若需要确认登录后的状态,可以尝试访问需要登录的页面 # test_response = ssn.get("https://www.fshare.vn/my") # print(test_response.text)
关键点说明
- 必须使用同一个
session对象:它会自动保存登录页面设置的Cookie,确保后续POST请求的会话一致性,避免被服务器判定为非法请求。 - 如果
BeautifulSoup没安装,先执行pip install beautifulsoup4完成安装。 - 你之前直接POST失败的核心原因就是缺少了这个服务器生成的CSRF令牌——服务器会验证令牌的有效性,只有从当前会话的登录页面获取的令牌才被认可,所以直接构造数据提交会返回400错误。
内容的提问来源于stack exchange,提问作者Hải Phong
相关产品推荐
相关产品推荐

