奇怪的PHP表单帖子

时间:2018-04-05 17:33:20

标签: python html python-requests urllib3

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

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

我已经抽象了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

其次,所有“隐藏”输入是什么?我不确定这个页面如何获取给定的登录数据并将其传递给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&amp; CSS

1 个答案:

答案 0 :(得分:0)

您所看到的可能是CSRF token

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

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

完整步骤如下:

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

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