我读了answer的问题:“如何使用Python的Requests模块登录”一个网站?“
答案是:“首先检查登录表单的来源以获取三条信息 - 表单发布的URL,以及用户名和密码字段的名称属性。”
我怎么看,这个morningstar.com页面的用户名和密码的名称属性是什么? https://www.morningstar.com/members/login.html
我有以下代码:
import requests
url = 'http://www.morningstar.com/members/login.html'
url = 'http://beta.morningstar.com'
with open('morningstar.txt') as f:
username, password = f.read().splitlines()
with requests.Session() as s:
payload = login_data = {
'username': username,
'password': password,
}
p = s.post(url, data=login_data)
print(p.text)
但 - 除其他外 - 它打印:
This distribution is not configured to allow the HTTP request method that was used for this request. The distribution supports only cachable requests.
什么应该url
和data
为post
?
还有另一个使用answer的selenium
,但有可能避免这种情况吗?
这有点难,我不得不使用拦截代理,但这里是:
import requests
s = requests.session()
auth_url = 'https://sso.morningstar.com/sso/json/msusers/authenticate'
login_url = 'https://www.morningstar.com/api/v2/user/login'
username = 'username'
password = 'password'
headers = {
'Access-Control-Request-Method': 'POST',
'Access-Control-Request-Headers': 'content-type,x-openam-password,x-openam-username',
'Origin': 'https://www.morningstar.com'
}
s.options(auth_url, headers=headers)
headers = {
'Referer': 'https://www.morningstar.com/members/login.html',
'Content-Type': 'application/json',
'X-OpenAM-Username': username,
'X-OpenAM-Password': password,
'Origin': 'https://www.morningstar.com',
}
s.post(auth_url, headers=headers)
data = {"productCode":"DOT_COM","rememberMe":False}
r = s.post(login_url, json=data)
print(s.cookies)
print(r.json())
到目前为止,您应该进行经过身份验证的会话您应该在s.cookies
中看到一堆cookie以及有关您在r.json()
的帐户的一些基本信息。
如代码所示,用户名输入字段为:
<input id="uim-uEmail-input" name="uEmail" placeholder="E-mail Address" data-msat="formField-inputemailuEmail-login" type="email">
密码输入字段是:
<input id="uim-uPassword-input" name="uPassword" placeholder="Password" data-msat="formField-inputpassworduPassword-login" type="password">
在name=
之后的每一行都列出了名称:
用户名:"uEmail"
密码:"uPassword"