使用Requests无法加载完整HTML,无法获取登录所需CSRF Token
解决Requests无法获取CSRF Token的问题
常见原因
- JS动态生成Token:页面的CSRF Token是通过前端JavaScript动态插入到DOM中的,Requests作为纯HTTP请求库,不会执行页面JS,自然拿不到渲染后的Token,而浏览器和Selenium会执行JS,所以能看到。
- 请求头不完整:服务器会根据请求头判断请求来源,若Requests发送的请求缺少关键头信息(比如
User-Agent、Referer),可能返回简化版页面,不包含Token。 - Token存储在Cookie中:有些站点的CSRF Token会先放在Cookie里,再由JS读取并插入到页面HTML中,直接用Requests获取页面HTML自然看不到,但Cookie里已经有值了。
解决方法
- 检查响应Cookie:发送页面请求后,查看
response.cookies,寻找类似csrf_token、XSRF-TOKEN的字段,直接提取这个值用于登录请求。示例代码:import requests session = requests.Session() response = session.get("目标页面URL") # 从Cookie中取Token csrf_token = session.cookies.get("csrf_token") - 补全请求头:复制浏览器的请求头(可在开发者工具的Network面板获取),添加到Requests请求中,确保服务器返回完整页面。示例:
headers = { "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", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3" } response = session.get("目标页面URL", headers=headers) # 再从HTML中提取Token - 抓包找Token接口:打开浏览器开发者工具,刷新页面时观察Network请求,看是否有专门获取Token的AJAX接口(比如
/api/get-csrf-token),直接用Requests调用该接口获取Token。 - 使用支持JS执行的工具:如果必须依赖JS生成Token,可以用
playwright或pyppeteer这类轻量无头浏览器工具,它们能执行页面JS,获取渲染后的HTML中的Token。
内容的提问来源于stack exchange,提问作者borj123
相关产品推荐
相关产品推荐

