本仓库提供了一个可以获取复旦大学教务服务网站/选课网站中公开的开课数据的 Node.js 命令行程序,并存有历年开课数据的备份,以便本校师生针对开课数据进行相关数据分析和程序开发。
由于当前便于获取课程数据的有效数据源只有每学期短暂开放的选课窗口,一旦错过就很难再拿到,所以本项目需要长期不间断的维护,如果你是在校的本科同学并且愿意帮助这个项目继续进行下去,欢迎阅读文末的贡献指南。
如果你只需要已经爬取好的课程数据包,可以前往 Releases 页面下载所需数据包。
准备好 cookies 放在 config.json
中,安装依赖,运行 yarn xk
。
将源码下载或 clone 到本地,确保本地安装了较新版本的 Node.js,本程序应该可以直接用 NPM CLI 运行,但我喜欢用 yarn 🐶,所以本文说明中均使用 yarn。
要安装 yarn,可以执行:
npm i -g yarn
接下来在代码根目录执行下方命令来安装依赖:
yarn # 或者 yarn install
然后将项目根目录中的 config.example.json
重命名为 config.json
。现在试试
yarn hello # 或者 yarn run hello
如果你的命令行向你打了个招呼,那说明准备工作相当 OK 👍。
每个学期都有一个唯一的整数作为其 ID,其会作为之后爬虫请求中一个必填的参数,所以我们需要先得到它。
获取单个学期 ID 最简单的方法就是登录 jwfw,进入“我的”->“课程大纲查询”,切换到要查询的学期后,看浏览器 URL 参数中 lesson.semester.id
这一项对应的值。
如果只需要当前选课学期 ID,也可以在下一步“配置登录态”中从 Cookies 中找到 semester.id
这一项。
如果要查看过往所有学期的 ID 映射,需要使用浏览器开发者工具,捕获上述页面的 Network 中 dataQuery.action
这个请求,其中会包含所有 ID 映射数据。
在获取到要爬取的学期 ID 后,请将其填入 config.json
中 SEMESTER_ID
这一项。
由于学校登录系统逻辑时不时会改变(加上我懒),所以我并没有做自动登录逻辑。每次爬取前需要手动登录 xk 后将本地 Cookies 复制到配置文件中,以拿到网页中的登录态。
拿 Cookies 的方法:
- 进入 xk 网站页面并登录
- 进入选课界面,打开浏览器开发者工具(一般快捷键是 F12,或者右键“检查”/“审查元素”)
- 选中“Network”栏后,随便搜索一次课程,如“COMP11”
- 点击
stdElectCourse
这个请求,找到“Request Headers”中“cookie”这一项,完整复制其内容,就是我们要的 Cookies - 顺便看一下这个请求中“General”的“Request URL”项末尾的
profileId
的值,将其填入到config.json
中的XK_PROFILE_ID
中
将拿到的 Cookies 填入到 config.json
中 XK_COOKIES
字段即可。现在在一段时间内我们拥有了登录态。
在项目根目录运行:
yarn xk
即可爬取到当前账号在当前学期所有可选课程的数据。
如果需要合并两份爬取到的数据(比如男生女生账号),将需要合并的 JSON 文件放到 data/combine
目录下,在项目根目录运行:
yarn combine
即可将 data/combine
中所有 ID 不同的课程合并到一个 JSON 文件下。
- 每个学生账号只能搜索到自己在三轮选课中可以选择的课程,所以对限制年级、限制专业、限制性别的课程(如体育)需要合并多个账号的爬取结果才能得到完整数据。建议至少分别至少使用一个男生和一个女生账号进行爬取(大一最好)
- 每学期可爬取到的课程和课程信息(如上课地点等)会随选课轮次更新,一般到三轮选课才可以获得完整开课信息
- Cookies 登录态一段时间无活动会过期,每次爬取前请手动更新配置文件中的 Cookies
- 如果在网页端触发了登出操作(包括“另一设备已经登陆”这种情况),Cookies 会失效,所以程序运行期间尽量不要用其他设备登录 jwfw 或 xk
开课院系无法从 xk 获取,仅能在 jwfw 课程大纲列表拿到,如果需要这一字段,需要另外从 jwfw 爬取。
和 xk 部分一样,需要先安装好前置依赖,并且获取到 jwfw 的 Cookies(和 xk 不通用),填入 config.json
的 JWFW_COOKIES
字段。
运行如下命令来爬取到指定学期的大纲列表数据:
yarn jwfw
将 xk 数据放到 data/insert/xk.json
,将大纲列表数据放到 data/insert/jwfw.json
,运行:
yarn insert
该脚本会试图把大纲列表数据中的开课院系字段插入到 xk 数据中对应课程的数据中,并且输出仅存在于某一边的课程列表。
- 极少数课程仅能在 jwfw 或 xk 其中一边爬取到,且不同同学有所区别,原因不明
- jwfw 课程大纲有时会在很晚才发布,在发布前运行爬虫是没有用滴,请先在网页上确认有数据
参见数据字段说明文档。
本项目有一定特殊性,因为目前的唯一数据源是学校的选课系统,而选课系统仅在每学期特定时段开放,一旦错过一个学期就很难再拿到以往学期的数据,所以每学期都需要有至少一位在校同学运行这个程序拿到数据并将数据提供给我们来备份。
任何在校的本科同学都可以通过以下方式帮助我们将数据源传递下去:
- 联系我们,告诉我们你愿意帮助我们获取数据,我们的在校同学会手把手教你如何操作 ♥
- 按照文档说明爬取到数据后,将数据通过邮件发送给我们,或者通过本仓库的 GitHub Issue 发布出来
- 如果你对本项目涉及到的技术知识有一定基础或非常感兴趣,请大胆联系我们作为潜在的维护者参与项目,我们会一直需要在校同学的帮助!
你也可以作为开源贡献者编写项目代码,直接提出 Issue 或 PR 即可,潜在的工作包括但不限于:
- 自动登录
- 代码优化
- 更多可用脚本(格式转换、数据清洗等)
- 学校课程表 PDF 解析
- ...
衷心感谢任何愿意帮助这个项目的同学,你们的贡献对未来的复旦师生或许会有非凡的意义!
- Ahacad 邮件:ahacad@126.com【当前主要维护者】
- CLDXiang 邮件:cldxiang@qq.com
Thanks! | Did |
---|---|
CLDXiang | 💻 开发 / 📚 数据 |