本仓库提供了一个可以获取复旦大学教务服务网站/选课网站中公开的开课数据的 Node.js 命令行程序,并存有历年开课数据的备份,以便本校师生针对开课数据进行相关数据分析和程序开发。
由于当前便于获取课程数据的有效数据源只有每学期短暂开放的选课窗口,一旦错过就很难再拿到,所以本项目需要长期不间断的维护,如果你是在校的本科同学并且愿意帮助这个项目继续进行下去,欢迎阅读文末的贡献指南。
如果你只需要已经爬取好的课程数据包,可以前往 Releases 页面下载所需数据包。
⚠️ 注意:2021冬季学期及以前的数据为旧版格式,与新版爬虫脚本生成的格式并不完全一致,若需要统一格式请自行处理。本仓库的 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 是学校网站判断你身份的凭据,请不要将它泄露给别人,否则相当于将账号和密码交给别人。
拿 Cookies 的方法:
stdElectCourse
这个请求,找到“Request Headers”中“cookie”这一项,完整复制其内容,就是我们要的 CookiesprofileId
的值,将其填入到 config.json
中的 XK_PROFILE_ID
中将拿到的 Cookies 填入到 config.json
中 XK_COOKIES
字段即可。现在在一段时间内我们拥有了登录态。
在项目根目录运行:
yarn xk
即可爬取到当前账号在当前学期所有可选课程的数据。
如果需要合并两份爬取到的数据(比如男生女生账号),将需要合并的 JSON 文件放到 data/combine
目录下,在项目根目录运行:
yarn combine
即可将 data/combine
中所有 ID 不同的课程合并到一个 JSON 文件下。
开课院系无法从 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 数据中对应课程的数据中,并且输出仅存在于某一边的课程列表。
参见数据字段说明文档。
本项目有一定特殊性,因为目前的唯一数据源是学校的选课系统,而选课系统仅在每学期特定时段开放,一旦错过一个学期就很难再拿到以往学期的数据,所以每学期都需要有至少一位在校同学运行这个程序拿到数据并将数据提供给我们来备份。
任何在校的本科同学都可以通过以下方式帮助我们将数据源传递下去:
你也可以作为开源贡献者编写项目代码,直接提出 Issue 或 PR 即可,潜在的工作包括但不限于:
衷心感谢任何愿意帮助这个项目的同学,你们的贡献对未来的复旦师生或许会有非凡的意义!
Thanks! | Did |
---|---|
CLDXiang | 💻 开发 / 📚 数据 |