奇怪的 PHP 形式 post

Strange PHP form post

所以我正在编写一个网络爬虫来从我大学的网站上批量下载 PDF,因为我不喜欢一个一个地下载它们。

我已经使用 'requests' 模块使大部分代码正常工作。问题是,您必须登录大学帐户才能访问 PDF,因此我设置了请求,要求在下载 PDF 之前使用 cookie 登录我的大学帐户,但是 HTML 表格要签名大学页面上的 in 相当奇特。

我已经提取了 HTML 可以在这里找到:

<form action="/login" method="post">
    <fieldset>
        <div>
            <label for="username">Username:</label>                          
            <input id="username" name="username" type="text" value="" />

            <label for="password">Password:</label>
            <input id="password" name="password" type="password" value=""/>

            <input type="hidden" name="lt" value="" />
            <input type="hidden" name="execution" value="*very_long_encrypted_code*" />
            <input type="hidden" name="_eventId" value="submit" />
            <input type="submit" name="submit" value="Login" />
        </div>
    </fieldset>
</form>

首先,表单中的 action 参数没有引用我不理解的 PHP 文件。 action="/login" 是引用页面本身,还是 http://www.blahblah/login/login? (HTML 取自页面 http://www.blahblah/login

其次,所有 'hidden' 输入是什么?我不确定此页面如何获取给定的登录数据并将其传递给 PHP 脚本。

这导致我的 python 脚本中的请求登录失败:

import requests
user = input("User: ")
passw = input("Password: ")
payload = {"username" : user, "password" : passw}
s = requests.Session()
s.post(loginURL, data = payload)
r = s.get(url)

我原以为这会获取登录数据并将我登录到页面,但 r 只是分配了原始登录页面。我假设它与 HTML 中奇怪的 PHP 交互有关。我有什么想法需要更改吗?

编辑:我想我还要提到页面上根本没有 javascript。纯粹HTML & CSS

您正在查看的可能是 CSRF token

链接的答案非常好,但总而言之,这些令牌用于确保您无法从 Web 浏览器中的另一个页面向站点发送恶意请求。在这种情况下有点傻,因为登录没有任何后果。它可能是由您大学网站使用的框架自动添加的。

您必须在登录前从登录页面提取此令牌 POST,然后将其包含在您的数据中。

完整的步骤如下:

  1. 获取登录页面
  2. 使用例如提取令牌BeautifulSoup 或 requests-html
  3. 发送登录请求:

    payload = {"username" : user, "password" : passw, "execution": token}