带有请求的 Python 网页抓取 - 状态代码 200,但未成功登录

问题描述

准备问我的第一个问题和编程新手,所以请耐心等待: 我正在尝试使用 Python 和 requests-library 进行一些有趣的网络抓取。但是,我无法成功登录该网站。 这是我尝试登录的网站上表单的 html 代码

<body class="login"><div class="wrapper">
    
        <div class="wrapper_forms">
    <!-- Login Form --> 
            
                    <form class="login" action="?" method="post">
                        <fieldset>
                            <legend>Login</legend>
                            <label for="login_username">Benutzername:</label>
                            <input id="login_username" type="text" name="username" autofocus="autofocus" /><em>*</em><br>
                            <label for="login_password">Passwort:</label>
                            <input id="login_password" type="password" name="password" /><em>*</em><br>
                            <em>* required</em><br>
                            <input type="hidden" name="form" value="login" />
                            <input id="screen_width" type="hidden" name="screen_width" value="" />
                            <input type="submit" value="Login" />
                            <br><a class="pw_reset" href="?action=pw_reset">Passwort vergessen</a>
                            <br>
                        </fieldset>
                    </form>

这是我的代码的缩写版本。我还对我为了可读性而排除的 get 和 post 请求的响应对象进行了一些额外的检查。该站点当前没有有效的 SSL 证书,因此 verify = False 参数。

from bs4 import BeautifulSoup
import requests


# Start session
session = requests.Session()

# payload
payload = {'username':'****','password':'****','form':'login','screen_width':'1920'}

# variables
login = "https://altklausurendb.de/login.PHP"
dest = "https://altklausurendb.de/index.PHP"

# initial get request to retrieve cookies and headers
s = session.get(login,verify = False)

cookies = s.cookies.get_dict()
headers = s.headers

# distribute payload
r1 = session.post(login,data = payload,cookies = cookies,headers = headers,verify = False)

#download content of destination site
r2 = session.get(dest,verify = False)

soup = BeautifulSoup(r2.text,'html.parser')

print(soup)

打印函数输出返回上面的 html 表单,而不是 https://altklausurendb.de/index.PHP内容,后者是第二个 dest 请求的 GET 变量。

经过大量阅读此处、reddit 和 WWW 的其他内容后,我自己尝试的方法

  • 无需在 POST 请求中显式传递 cookie 和标头即可运行这一切(显而易见)
  • 手动登录,检查我登录网站时生成POST 请求,使用网络点击下的 Chrome 开发工具。甚至在脚本的单独版本中手动复制标题,以防 requests header 函数以某种方式提供错误标题
  • 使用 HTTPBasicAuth 进行登录过程
  • 对从初始 responseGET 请求创建的 POST 对象运行所有检查,有趣的是,无论用户名是什么,状态代码始终为 200和我在字典中提供的密码 --> 这让我怀疑,如果网站没有以 POST 响应错误凭据,则 403 请求未正确提交。

我看到某些网站在 name 语句中也有一个 <input type="submit"> 变量,您必须将其传递给字典。然而,这个网站似乎没有它,基本上这就是我现在卡住的地方。

如果他们想自己重现脚本的行为,我愿意将我在网站上创建的测试帐户的凭据发送给某人。

感谢您的耐心等待,我知道网络抓取问题并不是最喜欢的问题,感谢您的帮助!

解决方法

扔掉所有这些,得到 selenium 模块。 BS4 适合抓取 HTML,但如果您要抓取动态页面,则需要 selenium。