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

Python爬取需微软登录的校园成绩站:自动登录问题求助

解决Aurion成绩爬取中的Microsoft自动登录问题

问题根源

你遇到的cookiesdisabled重定向,是因为Microsoft登录系统检测到你的请求缺少真实浏览器的核心特征——比如没有先获取初始会话Cookie、跳过了表单隐藏字段验证,或者请求头过于简单,被判定为不支持Cookie的非浏览器环境。直接POST邮箱密码的方式跳过了Microsoft OAuth登录的完整流程,自然无法通过认证。

解决方案

1. 模拟完整的浏览器登录流程

Microsoft的登录需要逐步完成会话初始化、表单字段提取、凭证提交三个核心步骤,以下是修正后的代码:

from bs4 import BeautifulSoup
import requests
import csv

# 模拟真实浏览器的请求头,避免被反爬识别
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',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Language': 'fr-FR,fr;q=0.8,en-US;q=0.5,en;q=0.3',
    'Referer': 'https://aurion.ieseg.fr/'
}

def aurion_login_and_scrape(email, password):
    session = requests.Session()
    session.headers.update(HEADERS)

    # Step 1: 访问Aurion登录页,获取跳转到Microsoft的会话上下文
    session.get('https://aurion.ieseg.fr/openid_connect_login')

    # Step 2: 访问Microsoft登录页面,提取动态生成的表单字段
    ms_auth_url = 'https://login.microsoftonline.com/08983daf-5aca-4f44-bc65-c23ce32d46ec/oauth2/authorize?response_type=code&client_id=dcd45342-6b22-4490-aaa6-39e6199c2bf6&scope=openid&redirect_uri=https%3A%2F%2Faurion.ieseg.fr%2Fopenid_connect_login&sso_reload=true'
    ms_login_page = session.get(ms_auth_url)
    soup = BeautifulSoup(ms_login_page.text, 'html.parser')

    # 提取所有隐藏表单字段(这些是Microsoft验证会话的关键)
    login_payload = {}
    for hidden_input in soup.find_all('input', type='hidden'):
        name = hidden_input.get('name')
        value = hidden_input.get('value')
        if name and value:
            login_payload[name] = value

    # 添加账号密码
    login_payload['loginfmt'] = email
    login_payload['passwd'] = password

    # Step 3: 提交登录表单,完成认证
    login_response = session.post(ms_auth_url, data=login_payload)

    # 检查是否触发了MFA(多因素认证),如果有需要手动处理或使用令牌方案
    if 'mfa' in login_response.url.lower():
        raise Exception("账号开启了多因素认证,无法自动登录,请使用令牌或手动认证方案")

    # Step 4: 爬取成绩数据
    grade_page = session.get('https://aurion.ieseg.fr/faces/LearnerNotationListPage.xhtml')
    soup = BeautifulSoup(grade_page.text, 'html.parser')
    results = soup.find(id="form:dataTableFavori_data")
    elements = results.find_all("tr", role="row")

    allIDs = []
    allGrades = []
    for element in elements:
        publishedGrade = element.find_all("td", role="gridcell")
        id_parts = publishedGrade[1].text.split("_")
        allIDs.append(id_parts[-2])
        allGrades.append(publishedGrade[3].text)

    # 保存到CSV
    with open('grades.csv', 'w', encoding='UTF-8', newline='') as f:
        writer = csv.writer(f)
        writer.writerow(["课程ID", "成绩"])
        for course_id, grade in zip(allIDs, allGrades):
            writer.writerow([course_id, grade])

# 调用示例
aurion_login_and_scrape("你的学校邮箱", "你的密码")

2. 处理多因素认证(MFA)

如果你的账号开启了MFA,纯requests无法自动完成二次验证,此时可以:

  • 临时方案:手动获取有效会话的Cookie,存储在Django的数据库或缓存中,定期复用
  • 长期方案:注册Microsoft Azure应用,使用OAuth2授权码流程获取访问令牌,通过API调用获取成绩(需要学校IT部门授权)

3. Django集成建议

  • 将爬取逻辑封装为异步任务(比如用Celery),避免阻塞Django的HTTP请求
  • 存储认证后的会话Cookie或令牌,减少重复登录次数
  • 添加异常处理,捕获登录失败、页面结构变化等情况

重要提示

  • 不要硬编码nonce和state参数,这些是每次会话动态生成的,必须从登录页面提取
  • 保持Session对象全程复用,Cookie才会持续有效
  • 定期更新User-Agent,避免被反爬机制拦截

内容的提问来源于stack exchange,提问作者ERIC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:50:25