【问题标题】:python-requests and complicated formspython-requests 和复杂的表单
【发布时间】:2014-02-02 13:25:13
【问题描述】:

我正在尝试为我的大学网站制作网络爬虫,但我无法通过登录页面。

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)

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

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

【问题讨论】:

  • python有没有报错? r.text的内容是什么?
  • 请说明您的期望和实际发生的情况。如果您说“显然无法正常工作”,则很难找出问题所在。您还应该告诉我们您收到了哪些错误消息。
  • 我建议您使用wiki.jasig.org/display/CASC/Pycas 让生活更轻松。
  • 您确定您的网址吗?我认为正确的是login.ull.es/cas-1/login
  • @Llopis 额外的后缀只是登录后重定向到的页面。

标签: python forms python-3.x python-requests


【解决方案1】:

"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

提取cookie非常简单,参见requests文档。

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

from BeautifulSoup import BeautifulSoup as soup

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 2020-07-18
  • 2014-10-14
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多