python请求和复杂的表单

0 python forms python-3.x python-requests

我正在尝试为我的大学网站制作一个网络刮板,但我无法通过登录页面.

import requests
URL = "https://login.ull.es/cas-1/login?service=https%3A%2F%2Fcampusvirtual.ull.es%2Flogin%2Findex.php%3FauthCAS%3DCAS"
USER = "myuser"
PASS = "mypassword"

payload = {
    "username": USER,
    "password": PASS,
    "warn": "false",
    "lt": "LT-2455188-fQ7b5JcHghCg1cLYvIMzpjpSEd0rlu",
    "execution": "e1s1",
    "_eventId": "submit",
    "submit": "submit"
}

with requests.Session() as s:
    r = s.post(URL, data=payload)
    #r = s.get(r"http://campusvirtual.ull.es/my/index.php")

    with open("test.html","w") as f:
        f.write(r.text)
Run Code Online (Sandbox Code Playgroud)

该代码显然不起作用,我不知道错误在哪里,我尝试只在有效负载中放置用户名和密码(其他值在Web标记为隐藏的源代码中),但这也是失败.

谁能指出我正确的方向?谢谢.(对不起我的英语不好)

Ste*_*ppo 6

"lt": "LT-2455188-fQ7b5JcHghCg1cLYvIMzpjpSEd0rlu"是会话ID或某种反CSRF保护或类似(疯狂猜测:hmac-ed随机ID号).重要的是它不是一个常量值,您必须通过发出GET请求从同一URL读取它.

GET回复中你有类似的东西:

<input type="hidden" name="lt" value="LT-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" />
Run Code Online (Sandbox Code Playgroud)

此外,还有一个JSESSIONID可能很重要的cookie.

这应该是你的流程:

  1. 得到了 URL
  2. 从响应中提取lt参数和JSESSIONIDcookie
  3. 填补了这个payload['lt']领域
  4. 设置cookie标头
  5. POST同样的URL.

提取cookie非常简单,请参阅requests文档.

提取lt参数有点困难,但您可以使用BeautifulSoup包来完成.假设您在名为变量的响应中text,您可以使用:

from BeautifulSoup import BeautifulSoup as soup

payload['lt'] = soup(text).find('input', {'name': 'lt', 'type': 'hidden'}).get('value')
Run Code Online (Sandbox Code Playgroud)