全校课表爬虫

PythonFastAPI爬虫

要解决的问题

教务系统只对校园网开放,课表数据又分散在多个入口(本科、研究生、合川与綦江两个校区)。想把它们汇总成一份随时能查的数据。

两个难点

一是网络限制。 教务系统只允许校园网访问,校外要经 WebVPN 转发。而 WebVPN 会校验客户端的 TLS 指纹 —— 用普通的 HTTP 请求库直接请求会被 302 拦掉。解决办法是用 curl_cffi 伪造 Chrome 的 TLS/HTTP2 指纹,让网关认为这是真实浏览器的流量。

二是登录流程。 CAS 单点登录页面的参数经过 AES-128-CBC 加密,需要先从登录页取回参数并解密,再构造登录请求换取 webvpn token。图形验证码用 ddddocr 识别。

做法

登录成功后定时全量抓取,用 APScheduler 每天凌晨跑一次,把两个校区、本科与研究生的课表统一落到 SQLite。

另起一个只读的 FastAPI 服务提供查询接口:

  • 按教师 / 教室 / 课程查课表
  • 查询某时段的教室占用情况
  • 查空教室

接口带 API Key 鉴权,Swagger 文档挂在 /docs。

一点说明

接口默认只对外暴露綦江校区的数据,全校数据仅供内部使用。