使用Python Requests库登录网站后仍停留在登录页面的问题排查咨询
解决POST登录请求后仍停留在登录页面的问题
我来帮你排查下代码里的问题,你遇到的POST请求后仍停留在登录页面的情况,通常是因为登录请求的几个关键环节没处理对,咱们一步步来梳理:
1. 登录请求的目标URL错误
你现在把POST请求发送到了页面地址http://202.53.81.30/results/vr17r2ra/index.html,但绝大多数网站的登录逻辑都是通过专门的接口处理的,而不是直接提交到页面本身。你需要先查看登录页面的表单action属性,找到真正的登录接口地址。
比如,打开目标登录页面,右键检查元素,找到登录表单的代码,会类似这样:
<form method="POST" action="/results/vr17r2ra/login"> <!-- 表单字段 --> </form>
这里的action值才是你应该POST的地址,而不是页面的index.html。
2. 登录提交的数据不完整
你当前的login_data只包含了username,但登录几乎都需要password字段,另外很多网站还会在登录表单里加入CSRF令牌之类的隐藏字段(比如csrfmiddlewaretoken、__RequestVerificationToken等),这些字段是服务器用来验证请求合法性的,必须和用户名密码一起提交。
你需要先通过GET请求获取登录页面的内容,从中提取这些隐藏字段的值,再加入到login_data中。
3. 缺少前置的GET请求初始化会话
虽然你用了requests.Session(),但直接发送POST请求的话,服务器可能没有收到必要的Cookie(比如会话标识),也无法验证你是从合法的登录页面跳转过来的。正确的流程应该是:
- 先用Session发送GET请求访问登录页面,获取服务器设置的Cookie和页面里的表单字段
- 再用同一个Session提交包含完整参数的POST请求
修正后的示例代码
from flask import Flask, render_template import requests from bs4 import BeautifulSoup # 需要安装bs4库:pip install beautifulsoup4 app = Flask(__name__) @app.route('/') def login_and_get_data(): s = requests.Session() headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36'} # 第一步:先GET登录页面,获取Cookie和表单字段 login_page_url = 'http://202.53.81.30/results/vr17r2ra/index.html' response = s.get(login_page_url, headers=headers) soup = BeautifulSoup(response.content, 'html.parser') # 提取表单的action地址(如果action是相对路径,要拼接成完整URL) form = soup.find('form') login_action_url = login_page_url.rsplit('/', 1)[0] + '/' + form['action'] # 根据实际情况调整 # 提取所有表单字段(包括隐藏字段) login_data = {} for input_tag in form.find_all('input'): name = input_tag.get('name') if name: login_data[name] = input_tag.get('value', '') # 补充用户名和密码 login_data['username'] = '198w1a0461' login_data['password'] = '你的密码' # 这里替换成实际密码 # 第二步:发送POST请求登录 p = s.post(login_action_url, data=login_data, headers=headers) # 检查是否登录成功:可以通过判断响应内容是否包含登录后的特征文本,比如"欢迎"之类的 if '欢迎' in p.text: da = p.content else: da = b'登录失败,请检查参数' return render_template('third.html', f=da) if __name__ == '__main__': app.run(debug=True)
模板页面的小问题
你的third.html里直接渲染{{f}}会把HTML内容转义成纯文本,导致页面显示一堆HTML代码,应该加上safe过滤器:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>report</title> </head> <body> {{f|safe}} </body> </html>
内容的提问来源于stack exchange,提问作者user15177090




