使用Python Requests实现网站表单登录无响应问题求助
问题原因
- 缺失必填的隐藏校验参数:你提供的HTML表单里存在name为
token的隐藏输入项,这是网站用于防范CSRF攻击的校验字段,每次访问登录页面都会生成新的有效值,必须先从GET请求返回的页面中提取该值,再带入POST请求才能通过校验 - 提交字段名不匹配:
- 交易PIN对应的表单字段名为
tradingPIN(PIN为大写),你代码中写的tradingpin大小写不匹配,后端无法识别 - 用户名、密码输入框未设置name属性,说明该站点不是通过原生表单逻辑提交,而是通过JS读取控件ID获取值后提交,你需要用浏览器F12的网络面板抓实际登录请求的参数,确认这两个字段的提交key,常规情况下会和控件ID一致,即用户名字段为
u-value、密码字段为password
- 交易PIN对应的表单字段名为
- 未携带必要的请求头:部分站点会校验Referer、Content-Type等请求头,缺失也会导致请求被拦截
修正后参考代码
import requests from bs4 import BeautifulSoup headers = { 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36', 'Referer': 'https://my.website.com/', 'Content-Type': 'application/x-www-form-urlencoded' } with requests.Session() as s: url = "https://my.website.com/" r = s.get(url, headers=headers) # 提取隐藏token参数 soup = BeautifulSoup(r.text, 'lxml') token = soup.find('input', {'name': 'token'})['value'] login_data = { "token": token, # 这里的u-value和password字段请根据你抓包的实际key修改 "u-value": "myusername", "password": "mysupersecurepassword", "tradingPIN": "123456" # 如果有自动填充交易PIN的勾选需求,可补充"isTPinAutoFill": "on" } # 发起登录POST请求 r = s.post(url, data=login_data, headers=headers) # 打印登录后的返回内容确认是否跳转成功 print(r.status_code) print(r.text)
额外排查建议
如果修改后还是无法登录,用浏览器F12抓正常登录时的POST请求,对比以下信息:
- 所有提交的参数是否和抓包结果完全一致,包括key名、值的格式
- 请求头是否有特殊校验字段,比如
X-Requested-With、自定义鉴权头 - 确认POST提交的目标URL是否和你代码里的一致,部分站点的登录提交地址和登录页地址不同
内容的提问来源于stack exchange,提问作者Ben Daggers
相关产品推荐
相关产品推荐

