python请求和复杂的表单

时间:2014-02-02 13:25:13

标签: 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)

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

有人能指出我正确的方向吗?谢谢。 (对不起我的英文)

1 个答案:

答案 0 :(得分:6)

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

GET回复中,您有类似的内容:

<input type="hidden" name="lt" value="LT-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" />

此外,还有一个JSESSIONID Cookie可能很重要。

这应该是你的流程:

  1. 获取URL
  2. 从回复中提取lt参数和JSESSIONID Cookie
  3. 填写payload['lt']字段
  4. 设置Cookie标头
  5. 发布相同的URL
  6. 提取cookie非常简单,请参阅requests文档。

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

    from BeautifulSoup import BeautifulSoup as soup
    
    payload['lt'] = soup(text).find('input', {'name': 'lt', 'type': 'hidden'}).get('value')