Python 请求会话未启用 cookie

Python requests Session does not have cookies enabled

我正在尝试通过请求模块登录。我已经尝试了 GETPOST 方法,但我总是得到下面的响应。

错误。您的浏览器没有启用 cookie。如果没有 cookie 支持,此登录页面将无法运行。

这是我正在使用的脚本。任何帮助将不胜感激。

import requests
from bs4 import BeautifulSoup

S = requests.session()
headers = {
    'Content-Type': 'application/xhtml+xml',
    'Access-Control-Allow-Origin': '*',
    'Access-Control-Allow-Methods': 'GET, POST,OPTIONS',
    'Access-Control-Allow-Headers': '*',
    'Access-Control--Max-Age': '86400',
    'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36'
}

url = 'https://idp.maxebrd.safemls.net/idp/Authn/UserPassword'
response = S.get(url, headers=headers)
soup = BeautifulSoup(response.content, 'html.parser')
print(soup.prettify())

看来是Javascript支持的问题,第一次进入时查看源码,我们看到:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>SafeMLS&reg; Error</title>
<link id="logincss" rel="stylesheet" href="https://cdn.clareitysecurity.net/css/login.css" />
<script src="https://cdn.clareitysecurity.net/js/remember.min.js" type="text/javascript"></script>
</head>
<body>
<script type="text/javascript" src="https://cdn.clareitysecurity.net/sys/maxebrd/googletrack.js"></script>
<!--
LocalAddr: 172.16.17.42
LocalName: clt-web-pt01-a.safemls.net
ServerName: idp.maxebrd.safemls.net
-->
<script type="text/javascript">
if (isCookieEnabled() == false) {
    alert("Error. Your browser does not have cookies enabled. This login page will not function without cookie support.");
    document.location.href = "/idp/nocookies.jsp";
} else {
    document.location.href = "https://maxebrdi.paragonrels.com/";
}
</script>
</body>
</html>

由于 requests 没有 Javascript,我们必须手动应用页面需要正确加载的任何内容。
我们看到它将我们重定向到“https://maxebrdi.paragonrels.com/”,这可能会设置正确的 cookie 供我们在登录页面上使用。幸运的是,requests.Session() 默认情况下为我们做到了这一点和重定向。

import requests
headers = {
"Accept": "*/*",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; rv:60.0) Gecko/20100101 Firefox/60.0"
}
with requests.Session() as session:
    username = "username"
    password = "password"
    data = {
        "j_username": username,
        "password": password,
        "j_password": password,
        "j_logintype": "sso" #seems to be constant
    }
    #first set cookies
    session.get("https://maxebrdi.paragonrels.com/", headers=headers)
    #then do login
    result = session.post("https://idp.maxebrd.safemls.net/idp/Authn/UserPassword", headers=headers, data=data)
    print(result.text)

此 returns "No User Found" 消息(因为密码不正确)。
我建议您使用 Javascript 禁用扩展程序,清除页面的 cookie 并重新访问,这样您就可以像 requests 一样查看网页,同时查看 "Network" 选项卡以查看内容正在从您的浏览器发出请求并将其复制到您的脚本中。