Python requests模拟登录课程评价网站POST返回404问题咨询
大学课程评价网站登录POST返回404问题排查方案
可能的失败原因
- 提交地址不匹配:很多站点登录提交的接口地址和登录页面地址并不一致,你当前提交到
https://pomonastudents.org/login,实际浏览器登录时的POST接口可能是/users/sign_in、/sessions等其他路径,甚至路径末尾有无斜杠都会被识别为不同地址。 - 请求头缺失必要字段:从你代码里的
authenticity_token可判断站点是Rails框架开发,这类框架通常会校验Referer、Accept、Content-Type等请求头,缺失对应字段会直接返回404或422错误。你直接覆盖请求头的操作还可能删除了requests默认携带的标准头,进一步导致请求异常。 - payload格式错误:如果站点要求提交JSON格式的参数,你用默认表单格式
application/x-www-form-urlencoded提交就会被识别为非法请求,反之也会报错。 - 反爬策略拦截:部分校园站点会检测非浏览器的请求特征,比如请求间隔过短、缺少常见浏览器头,会直接返回404伪装页面不存在。
- 令牌校验不匹配:部分站点会把authenticity_token和Cookie值做绑定校验,如果你抓取令牌和提交请求的会话不统一、或者令牌抓取后间隔太久超过有效期,也会导致请求被拦截。
可执行的排查步骤
- 核对真实提交地址:打开浏览器网络面板,手动触发一次正常登录,确认
Request URL字段和你代码里的POST地址完全一致,包括协议类型、域名、路径、末尾斜杠都要完全匹配。 - 修正请求头设置:把直接赋值headers的操作改成增量更新,避免覆盖requests默认携带的标准头,同时从浏览器登录请求里复制全量请求头,逐个添加测试:
# 错误写法:覆盖默认头 # session.headers = {'User-Agent': 'xxx'} # 正确写法:增量更新,保留默认头 session.headers.update({ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36', 'Referer': 'https://pomonastudents.org/login', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8' }) - 校验payload提交格式:看浏览器登录请求的
Content-Type字段,如果是application/json,把提交代码从data=payload改成json=payload即可。 - 增加请求间隔:在GET登录页面和POST提交之间加1-2秒延迟,避免被反爬识别为机器人:
import time s = session.get("https://pomonastudents.org/login") time.sleep(2) payload.update({'authenticity_token': get_authenticity_token(s.text)}) - 打印完整响应信息排查:除了响应文本,还要打印状态码、响应头确认404的来源:
print(s.status_code) print(s.headers) print(s.text)
内容的提问来源于stack exchange,提问作者Tilo RC
相关产品推荐
相关产品推荐

