利用Python脚本计算安大教务系统GPA

利用Python脚本计算安大教务系统GPA

目录

背景介绍

在学校生活中,绩点(GPA)是学生评价自己学习成绩的重要指标。然而,安大新的教务系统(树维教务系统)只能查看各门课程的单独成绩,而无法直接查看总的平均学分绩点。这给很多同学带来了不便,尤其是需要频繁查阅GPA时。因此,我编写了一个Python脚本,通过自动化登录教务系统并抓取课程信息,来计算平均学分绩点(GPA)。

这个脚本使用了 Playwright 库来实现浏览器自动化操作,帮助用户在不需要手动登录和计算的情况下快速获得GPA。

为什么选择Playwright

在实现自动化浏览器操作时,Playwright相较于其他工具(如Selenium)具有以下几个优势:

  • 支持多种浏览器:Playwright支持Chromium、Firefox、WebKit等多个浏览器引擎,灵活性强。
  • 自动等待页面加载:Playwright具有智能等待机制,减少手动设置等待时间的需要,提高脚本的可靠性。
  • 跨平台支持:支持Windows、MacOS、Linux等多种操作系统,便于在不同环境中运行。
  • 强大的调试功能:Playwright提供丰富的调试选项,比如可以选择无头模式或带界面的模式,方便调试。

如何运行脚本

环境安装

要运行这个脚本,首先需要安装相关依赖。请确保你已安装Python 3.7+,并按以下步骤操作:

  1. 安装依赖库:

    pip install playwright
    
  2. 安装浏览器引擎:
    Playwright需要安装对应的浏览器引擎,运行以下命令:

    playwright install
    

运行步骤

  1. 打开终端或命令行,输入以下命令运行脚本:
    python script_name.py
    
  2. 脚本运行时,会提示输入学号和密码,请按照提示操作。

运行完成后,脚本会自动计算并输出你的总学分和平均学分绩点(GPA)。

脚本解读

登录教务系统

def login_to_ahu_jw(page):
    page.goto("https://jw.ahu.edu.cn/student/login?refer=https://jw.ahu.edu.cn/student/home")
    page.get_by_role("button", name=" 统一身份认证登录").click()
    page.get_by_placeholder("用户名").fill(学号)
    page.get_by_placeholder("密码").fill(密码)
    page.wait_for_load_state("networkidle")
    page.click('.landing_btn_bg')
    page.get_by_role("link", name="我的成绩").click()
    page.wait_for_load_state("networkidle")

在脚本的这一部分,我们使用了Playwright的page对象来自动化地打开安大教务系统的登录页面,填写用户名和密码,点击登录按钮,并等待页面加载完成。通过这个函数,用户无需手动操作,脚本会自动处理登录过程。

获取成绩数据

# Switch to the iframe
frame = page.frame_locator("iframe[name=\"e-home-iframe-1\"]")
    
# Extract course information
rows = frame.get_by_role("row")

登录成功后,脚本将切换到显示成绩的iframe页面。使用Playwright的frame_locator方法,我们定位到包含成绩的表格。接下来,脚本从表格中提取每一行的数据。

计算平均学分绩点

total_credits = 0
total_weighted_grade = 0

for row in rows.all()[1:]:  # Skip header row
    course_name = row.get_by_role("cell").first.inner_text().strip()
    credits = row.get_by_role("cell").nth(1).inner_text().strip()
    grade = row.get_by_role("cell").nth(2).inner_text().strip()
    
    try:
        credits = float(credits)
        grade = float(grade)
        
        if credits > 0 and grade > 0:
            total_credits += credits
            total_weighted_grade += credits * grade
            print(f"Course: {course_name}, Credits: {credits}, Grade: {grade}")
        else:
            print(f"Skipping course: {course_name} (incomplete data)")
    except ValueError:
        print(f"Error processing course: {course_name}")

在这部分代码中,脚本逐行读取课程信息,并提取课程名称、学分和成绩。如果数据有效(学分和成绩均大于0),则将该课程的学分乘以成绩,累加到总学分和加权成绩中。

处理异常情况

if total_credits > 0:
    gpa = total_weighted_grade / total_credits
    print(f"\nTotal Credits: {total_credits}")
    print(f"Average GPA: {gpa}")
else:
    print("No valid course data found.")

当所有课程处理完毕后,脚本会根据总学分和加权成绩计算平均学分绩点(GPA),并将结果打印出来。如果没有有效的课程数据,脚本会输出提示信息。

关闭浏览器

最后,脚本关闭浏览器:

context.close()
browser.close()

这一部分代码确保脚本在完成所有操作后正确释放资源,关闭浏览器以避免内存泄漏或不必要的资源占用。

总结

通过这个Python脚本,我们能够自动化地登录安大的教务系统,抓取课程成绩数据并计算总学分绩点(GPA)。使用Playwright库,大大简化了浏览器自动化的实现过程,使得即便没有Python基础的同学,也能通过简单的命令行操作获得自己的GPA。

Playwright的强大功能和简单易用性,使得该工具成为了处理此类自动化任务的绝佳选择。如果你有类似的需求,可以考虑学习和使用这个库来简化日常操作。

完整代码

from playwright.sync_api import Playwright, sync_playwright, expect

def login_to_ahu_jw(page):
    page.goto("https://jw.ahu.edu.cn/student/login?refer=https://jw.ahu.edu.cn/student/home")
    page.get_by_role("button", name=" 统一身份认证登录").click()
    page.get_by_placeholder("用户名").fill(学号)
    page.get_by_placeholder("密码").fill(密码)
    page.wait_for_load_state("networkidle")
    page.click('.landing_btn_bg')
    page.get_by_role("link", name="我的成绩").click()
    page.wait_for_load_state("networkidle")

def run(playwright: Playwright) -> None:
    browser = playwright.chromium.launch(headless=False)
    context = browser.new_context()
    page = context.new_page()
    
    login_to_ahu_jw(page)
    
    # Switch to the iframe
    frame = page.frame_locator("iframe[name=\"e-home-iframe-1\"]")
    
    # Extract course information
    rows = frame.get_by_role("row")
    total_credits = 0
    total_weighted_grade = 0
    
    for row in rows.all()[1:]:  # Skip header row
        course_name = row.get_by_role("cell").first.inner_text().strip()
        credits = row.get_by_role("cell").nth(1).inner_text().strip()
        grade = row.get_by_role("cell").nth(2).inner_text().strip()
        
        try:
            credits = float(credits)
            grade = float(grade)
            
            if credits > 0 and grade > 0:
                total_credits += credits
                total_weighted_grade += credits * grade
                print(f"Course: {course_name}, Credits: {credits}, Grade: {grade}")
            else:
                print(f"Skipping course: {course_name} (incomplete data)")
        except ValueError:
            print(f"Error processing course: {course_name}")
    
    if total_credits > 0:
        gpa = total_weighted_grade / total_credits
        print(f"\nTotal Credits: {total_credits}")
        print(f"Average GPA: {gpa}")
    else:
        print("No valid course data found.")
    
    # Close browser
    context.close()
    browser.close()

with sync_playwright() as playwright:
    学号 = input("请输入学号: ")
    密码 = input("请输入密码: ")
    run(playwright)
  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值