如何在不使用硒等无头浏览器的情况下登录morningstar.com?

问题描述 投票:2回答:2

我读了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.

什么应该urldatapost

还有另一个使用answerselenium,但有可能避免这种情况吗?

python python-3.x post get python-requests
2个回答
3
投票

这有点难,我不得不使用拦截代理,但这里是:

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()的帐户的一些基本信息。


1
投票

如代码所示,用户名输入字段为:

<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"

© www.soinside.com 2019 - 2024. All rights reserved.