首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不使用无头浏览器(如selenium )的情况下登录morningstar.com?

如何在不使用无头浏览器(如selenium )的情况下登录morningstar.com?
EN

Stack Overflow用户
提问于 2018-01-12 14:56:20
回答 2查看 1.4K关注 0票数 2

我阅读了answer的问题:“如何使用PythonRequest模块登录到网站?”

答案是:“首先检查登录表单的来源以获得三条信息--表单发布到的url,以及用户名和密码字段的名称属性。”

如何查看这个morningstar.com页面的用户名和密码的名称属性?https://www.morningstar.com/members/login.html

我有以下代码:

代码语言:javascript
复制
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)

但是--除了其他东西--它印的是:

代码语言:javascript
复制
This distribution is not configured to allow the HTTP request method that was used for this request. The distribution supports only cachable requests.

urldata对于post应该是什么?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-12 17:15:26

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

代码语言:javascript
复制
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请求。

代码语言:javascript
复制
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 details

URL和其他必需的值(如POST数据)可以从网络选项卡下的web浏览器的开发人员控制台(Ctrl+Shift+I)中获得。

票数 3
EN

Stack Overflow用户

发布于 2018-01-12 14:59:07

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

代码语言:javascript
复制
<input id="uim-uEmail-input" name="uEmail" placeholder="E-mail Address" data-msat="formField-inputemailuEmail-login" type="email">

密码输入字段是:

代码语言:javascript
复制
<input id="uim-uPassword-input" name="uPassword" placeholder="Password" data-msat="formField-inputpassworduPassword-login" type="password">

name=之后的每一行中都列出了名称

用户名:"uEmail"密码:"uPassword"

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48228739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档