我阅读了answer的问题:“如何使用PythonRequest模块登录到网站?”
答案是:“首先检查登录表单的来源以获得三条信息--表单发布到的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,但有可能避免这种情况吗?
发布于 2018-01-12 17:15:26
这有点困难,我不得不使用一个拦截代理,但这里是:
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()中帐户的基本信息。
站点改变了登录机制(可能是他们的整个CMS),所以上面的代码不再工作了。新的登录过程涉及到对/umapi/v1/sessions的一个POST和一个补丁请求,然后是对/umapi/v1/users的GET请求。
import requests
sessions_url = 'https://www.morningstar.com/umapi/v1/sessions'
users_url = 'https://www.morningstar.com/umapi/v1/users'
userName = 'my email'
password = 'my pwd'
data = {'userName':userName,'password':password}
with requests.session() as s:
r = s.post(sessions_url, json=data)
# The response should be 200 if creds are valid, 401 if not
assert r.status_code == 200
s.patch(sessions_url)
r = s.get(users_url)
#print(r.json()) # contains account detailsURL和其他必需的值(如POST数据)可以从网络选项卡下的web浏览器的开发人员控制台(Ctrl+Shift+I)中获得。
发布于 2018-01-12 14:59:07
如代码所示,用户名输入字段是:
<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"
https://stackoverflow.com/questions/48228739
复制相似问题