玛卡巴卡的blog 玛卡巴卡的blog
首页
提问箱
自传
植物分类
关于

玛卡巴卡

短暂的休息,是为了更好的再出发 有我爱和爱我的人,便什么都不会怕——
首页
提问箱
自传
植物分类
关于
  • 小程序开发
玛卡巴卡
2026-02-01
目录

diy选课助手

跳转网址:https://github.com/mkbk-with-circle/PKU-Schedule-Planner (opens new window)

博主用2h速通了一个用于爬取北大选课系统课程信息、智能解析课表、可视化选课管理的工具集。

这个项目诞生是因为笨人已经大四然后毕业学分修得差不多了,最后一学期想好好利用一下贵校的“通识课”资源,所以想多去其他院系听听课,于是乎挑选了将近十门其他院系的专业课,但是无奈必须要等到跨院系选课开始才可以安排课表;笨人当然可以接受旁听,但是也不能在课程间发生时间上的冲突对吧!遂用ai花了2h速通了一版可以爬取课程,自主选课的简易ui~

样式belike:

blog里就不多把README里的东西放进来了,大概说一下开发流程趴~

# 开发流程

博主脑子里大概生成了一个流程,分为爬虫爬取课表和制作ui界面,然后就开始玛不停蹄地写prompt()

# 一,爬虫爬取+数据处理

# 爬虫爬取

主要是把选课界面截了个图给ai(GPT5.2),然后把网址给他,告诉他我需要爬取这一页(包括后面页数)的课表,然后告诉他具体的"保存格式"(csv还是xlsx,一开始默认csv,但是因为其保存内容的格式兼容性不如xlsx),一开始ai写了个大致的框架出来,按照它的要求把cookie改完了之后可以进行选课了;但是初次运行发现虽然能访问网页,但是因为它不了解网页的html结构所以解析失败了,然后直接用开发者工具把有效信息的html结构给它,然后ai就给了一版能跑的代码,后续就是格式上的小问题;

这个时候就得到了xlsx下的文件:

# 数据处理

这一步主要是从爬虫爬取的数据文件中解析出需要的信息,并且做好方便后续ui文件调用的数据接口 大概有这几个关键prompt

  1. 以(课程号,课程名,老师,班号)为每个课表唯一的标识,并且可以由该四元组查询到该课程的其他附属信息;
  2. 解析上课时间(重点),需要解析出持续时间、周几上课、具体课时,并且每个课程可能还包括单双周等
  3. 做成合适的数据结构,方便后续调用该脚本从而直接获得

# 二,制作ui界面

直接把我喂给ai的prompt放在这里:

我需要你制作一个选课的ui界面;具体而言需要这样

  1. 我需要看到每一周的课表排布,从周一到周日的都要,并且每天有12节课(可以参考图中所示);就是虽然只显示某一周的,但是我可以通过左右按钮来查看1~16周的每一周的课表
  2. 我需要有课程目录,里面显示了上一阶段读取到的所有数据结构里的(课程名,老师)(这里不需要课程号,但是依然是三元组为唯一标识),可以用鼠标上下滑动查看;也可以通过“开课单位”进行筛选
  3. 课程目录应该分为两栏:“已选课课程目录”和“未选课课程目录”;
  4. 对于“未选课课程目录”我可以选取某个课程(最好可以多选),然后计算它们的时间是否冲突,如果不冲突就各自按照其上课时间加入到显示的课表中,然后这些课程移动到已选课课程目录,如果冲突就取消并且提示用户哪两个冲突了;
  5. 对于“已选课课程目录”,我可以选取某节课(最好可以多选)然后取消选课,显示的课表中也就去除掉对应时间的课程;
  6. 注意,总学分限制为25分(这个可以让用户修改学分限制)

# 功能特性

大概有这几个主要功能~

  • 课程数据爬取: 自动从北大选课系统获取所有可选课程信息
  • 智能课表解析: 支持节次制与钟点制的自动识别与转换
  • 可视化选课: 图形界面展示课表、检测时间冲突、学分管理
  • 多条件筛选: 按开课单位、教师、学分等维度过滤课程
  • 冲突检测: 自动识别时间冲突,防止选课失败

# 说在后面

因为目前仅仅是观察我自己的课表,然后得出了匹配/解析时间的规则,然而可能还会遇到其他奇奇怪怪的课表时间(例如清华互选课程的时间),这样的课表时间会导致无法解析,但是博主已经在里面加入了debug代码帮助大家尽快发现这样的问题,剩下的就要靠大家集思广益力!


更新一下 最近新增了“冲突课表保留”功能和“课表导入导出”功能!

上次更新: 2026/04/30, 17:04:36
最近更新
01
快乐小狗狂喜!(小声版)
05-01
02
乌黑的眼睛
04-30
03
人总在接近幸福时倍感幸福
04-29
更多文章>
Theme by Vdoing | Copyright © 2026-2026 玛卡巴卡 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式