You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需无头浏览器,如何用Requests正确实现Morningstar.com登录?

解决Morningstar登录的Requests请求问题

为什么你的代码会报错?

你POST到的http://beta.morningstar.com是静态页面,服务器配置只接受可缓存的请求(比如GET),不支持POST方法,所以才会返回那个错误提示。你需要找到专门处理登录请求的API端点,而不是直接POST到主页或登录页的URL。

如何找到正确的登录参数和URL?

  • 打开Morningstar的正式登录页:https://www.morningstar.com/members/login.html
  • 按下F12打开浏览器开发者工具,切换到「Network」标签,勾选「Preserve log」(避免登录后请求被清空)
  • 输入你的账号密码,点击登录按钮,观察Network面板里的请求:
    • 找类型为「POST」的请求,通常是XHR/Fetch类型,URL一般是类似https://www.morningstar.com/api/v2/xxx/login的API地址
    • 点击这个请求,查看「Form Data」部分,这里就是你需要提交的参数,包括字段名(比如用户名可能是email而不是username,密码是password,还有可能带csrfToken、rememberMe等)

修正后的Requests代码示例

首先,你需要先获取登录页的CSRF Token(很多网站用来防止跨站请求伪造),然后POST到正确的API端点。这里给出一个参考代码(注意:API端点和字段名可能会随网站更新变化,建议自己抓包确认):

import requests
from bs4 import BeautifulSoup

# 1. 基础配置
LOGIN_PAGE_URL = "https://www.morningstar.com/members/login.html"
# 这里的API URL是示例,实际要从抓包结果获取
LOGIN_API_URL = "https://www.morningstar.com/api/v2/user/session"

# 2. 读取账号密码
with open("morningstar.txt") as f:
    email, password = f.read().splitlines()

# 3. 用Session维持会话
with requests.Session() as session:
    # 自定义请求头,模拟浏览器访问
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
        "Referer": LOGIN_PAGE_URL
    }

    # 先访问登录页,获取Cookie和CSRF Token
    login_page_res = session.get(LOGIN_PAGE_URL, headers=headers)
    soup = BeautifulSoup(login_page_res.text, "html.parser")
    # 提取CSRF Token(根据实际页面结构调整,可能是meta标签或隐藏input)
    csrf_token = soup.find("meta", attrs={"name": "csrf-token"})["content"]

    # 4. 构造登录Payload
    login_payload = {
        "email": email,  # 替换成你抓包到的用户名字段名,可能是email而非username
        "password": password,
        "rememberMe": False,
        "_csrf": csrf_token  # 如果抓包看到这个参数就加上
    }

    # 5. 发送登录请求
    login_res = session.post(LOGIN_API_URL, data=login_payload, headers=headers)

    # 6. 验证登录结果
    if login_res.status_code == 200:
        print("登录成功!")
        # 测试访问需要登录的页面,比如个人投资组合页
        portfolio_res = session.get("https://www.morningstar.com/portfolio", headers=headers)
        print("个人页内容预览:", portfolio_res.text[:500])
    else:
        print(f"登录失败,状态码:{login_res.status_code}")
        print("错误详情:", login_res.text)

能不能避免使用Selenium?

当然可以!只要能通过抓包找到网站的登录API接口,用Requests这类HTTP库完全可以实现登录,而且效率比Selenium高很多。Selenium适合那些完全依赖JS渲染、没有明确API接口的场景,而Morningstar的登录流程是标准的API请求,不需要模拟浏览器。

注意事项

  • 网站的API端点和参数可能会随时更新,所以如果代码失效,记得重新抓包确认最新的请求信息
  • 确保请求头的User-Agent和Referer设置正确,避免被反爬机制拦截
  • 如果遇到验证码或更复杂的反爬,可能需要额外处理,但常规登录用上述方法即可

内容的提问来源于stack exchange,提问作者tommy.carstensen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:57:39