Skip to content

Ahacad/FDUCourseData

Repository files navigation

复旦大学本科开课数据爬虫

本仓库提供了一个可以获取复旦大学教务服务网站/选课网站中公开的开课数据的 Node.js 命令行程序,并存有历年开课数据的备份,以便本校师生针对开课数据进行相关数据分析和程序开发。

由于当前便于获取课程数据的有效数据源只有每学期短暂开放的选课窗口,一旦错过就很难再拿到,所以本项目需要长期不间断的维护,如果你是在校的本科同学并且愿意帮助这个项目继续进行下去,欢迎阅读文末的贡献指南。

✨ 我想要历年课程数据

如果你只需要已经爬取好的课程数据包,可以前往 Releases 页面下载所需数据包。

⚠️ 注意:2021冬季学期及以前的数据为旧版格式,与新版爬虫脚本生成的格式并不完全一致,若需要统一格式请自行处理。本仓库的 Releases 页面仅出于备份数据目的。

✨ 我想要爬取本学期课程数据

一句话总结

准备好 cookies 放在 config.json 中,安装依赖,运行 yarn xk

0. 做好准备

将源码下载或 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 👍。

1. 获取要爬取的学期 ID

每个学期都有一个唯一的整数作为其 ID,其会作为之后爬虫请求中一个必填的参数,所以我们需要先得到它。

获取单个学期 ID 最简单的方法就是登录 jwfw,进入“我的”->“课程大纲查询”,切换到要查询的学期后,看浏览器 URL 参数中 lesson.semester.id 这一项对应的值。

如果只需要当前选课学期 ID,也可以在下一步“配置登录态”中从 Cookies 中找到 semester.id 这一项。

如果要查看过往所有学期的 ID 映射,需要使用浏览器开发者工具,捕获上述页面的 Network 中 dataQuery.action 这个请求,其中会包含所有 ID 映射数据。

在获取到要爬取的学期 ID 后,请将其填入 config.jsonSEMESTER_ID 这一项。

2. 配置登录态

由于学校登录系统逻辑时不时会改变(加上我懒),所以我并没有做自动登录逻辑。每次爬取前需要手动登录 xk 后将本地 Cookies 复制到配置文件中,以拿到网页中的登录态。

⚠️ 注意:Cookies 是学校网站判断你身份的凭据,请不要将它泄露给别人,否则相当于将账号和密码交给别人。

拿 Cookies 的方法:

  1. 进入 xk 网站页面并登录
  2. 进入选课界面,打开浏览器开发者工具(一般快捷键是 F12,或者右键“检查”/“审查元素”)
  3. 选中“Network”栏后,随便搜索一次课程,如“COMP11”
  4. 点击 stdElectCourse 这个请求,找到“Request Headers”中“cookie”这一项,完整复制其内容,就是我们要的 Cookies
  5. 顺便看一下这个请求中“General”的“Request URL”项末尾的 profileId 的值,将其填入到 config.json 中的 XK_PROFILE_ID

将拿到的 Cookies 填入到 config.jsonXK_COOKIES 字段即可。现在在一段时间内我们拥有了登录态。

3. 运行爬取脚本

在项目根目录运行:

yarn xk

即可爬取到当前账号在当前学期所有可选课程的数据。

4. (可选)合并结果

如果需要合并两份爬取到的数据(比如男生女生账号),将需要合并的 JSON 文件放到 data/combine 目录下,在项目根目录运行:

yarn combine

即可将 data/combine 中所有 ID 不同的课程合并到一个 JSON 文件下。

关于 xk 的注意事项

  • 每个学生账号只能搜索到自己在三轮选课中可以选择的课程,所以对限制年级、限制专业、限制性别的课程(如体育)需要合并多个账号的爬取结果才能得到完整数据。建议至少分别至少使用一个男生和一个女生账号进行爬取(大一最好)
  • 每学期可爬取到的课程和课程信息(如上课地点等)会随选课轮次更新,一般到三轮选课才可以获得完整开课信息
  • Cookies 登录态一段时间无活动会过期,每次爬取前请手动更新配置文件中的 Cookies
  • 如果在网页端触发了登出操作(包括“另一设备已经登陆”这种情况),Cookies 会失效,所以程序运行期间尽量不要用其他设备登录 jwfw 或 xk

✨ 开课院系?

开课院系无法从 xk 获取,仅能在 jwfw 课程大纲列表拿到,如果需要这一字段,需要另外从 jwfw 爬取。

1. 准备工作

和 xk 部分一样,需要先安装好前置依赖,并且获取到 jwfw 的 Cookies(和 xk 不通用),填入 config.jsonJWFW_COOKIES 字段。

2. 爬取大纲列表数据

运行如下命令来爬取到指定学期的大纲列表数据:

yarn jwfw

3. 注入 xk 数据

将 xk 数据放到 data/insert/xk.json,将大纲列表数据放到 data/insert/jwfw.json,运行:

yarn insert

该脚本会试图把大纲列表数据中的开课院系字段插入到 xk 数据中对应课程的数据中,并且输出仅存在于某一边的课程列表。

关于 jwfw 的注意事项

  • 极少数课程仅能在 jwfw 或 xk 其中一边爬取到,且不同同学有所区别,原因不明
  • jwfw 课程大纲有时会在很晚才发布,在发布前运行爬虫是没有用滴,请先在网页上确认有数据

📜 数据字段说明

参见数据字段说明文档

💡 我们需要你的帮助

本项目有一定特殊性,因为目前的唯一数据源是学校的选课系统,而选课系统仅在每学期特定时段开放,一旦错过一个学期就很难再拿到以往学期的数据,所以每学期都需要有至少一位在校同学运行这个程序拿到数据并将数据提供给我们来备份。

任何在校的本科同学都可以通过以下方式帮助我们将数据源传递下去:

  • 联系我们,告诉我们你愿意帮助我们获取数据,我们的在校同学会手把手教你如何操作 ♥
  • 按照文档说明爬取到数据后,将数据通过邮件发送给我们,或者通过本仓库的 GitHub Issue 发布出来
  • 如果你对本项目涉及到的技术知识有一定基础或非常感兴趣,请大胆联系我们作为潜在的维护者参与项目,我们会一直需要在校同学的帮助!

你也可以作为开源贡献者编写项目代码,直接提出 Issue 或 PR 即可,潜在的工作包括但不限于:

  • 自动登录
  • 代码优化
  • 更多可用脚本(格式转换、数据清洗等)
  • 学校课程表 PDF 解析
  • ...

衷心感谢任何愿意帮助这个项目的同学,你们的贡献对未来的复旦师生或许会有非凡的意义!

📧 联系我们

🙏🏻 贡献者们,ありがとう!

Thanks! Did
CLDXiang 💻 开发 / 📚 数据