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
相关产品推荐
相关产品推荐

