我正在尝试为我的大学网站制作网络抓取工具,但我无法通过登录页面。
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标记为隐藏的源代码中)但是这也是失败的。
有人能指出我正确的方向吗?谢谢。 (对不起我的英文)
答案 0 :(得分:6)
"lt": "LT-2455188-fQ7b5JcHghCg1cLYvIMzpjpSEd0rlu"
是会话ID或某种反CSRF保护或类似(疯狂猜测:hmac-ed随机ID号)。重要的是它不是一个恒定的值,你必须通过发出GET请求从同一个URL读取它。
在GET
回复中,您有类似的内容:
<input type="hidden" name="lt" value="LT-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" />
此外,还有一个JSESSIONID
Cookie可能很重要。
这应该是你的流程:
URL
lt
参数和JSESSIONID
Cookie payload['lt']
字段URL
。提取cookie非常简单,请参阅requests
文档。
提取lt
参数有点困难,但您可以使用BeautifulSoup
包来完成。假设您在名为text
的变量中有响应,则可以使用:
from BeautifulSoup import BeautifulSoup as soup
payload['lt'] = soup(text).find('input', {'name': 'lt', 'type': 'hidden'}).get('value')