You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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

火山引擎 最新活动