需要为新生设计一个查课表的应用(入学一段时间内无法登陆教务系统,所以课表获取难),基本思路用自己的账号模拟登陆学校的教务系统,爬取课表,根据输入的班级查询,并存储数据库。
难点:
- 数据的获取
- 课表界面的设计
技术:php
html&js&css
curl
模拟登陆教务系统并存储cookie
本项目的爬虫使用php curl实现,这部分没啥好记录的
获取班级列表
由于班级列表时分页的,懒得爬了,而且里面也有好多无用信息,所以直接手动导出了一份班级信息的js文件。由于我校专业太多,按照学院进行一个划分,(数据中每一条包括班级名和所属学院名),利用了js的set提取出了不重复的学院数组。
前端用了两个select下拉列表(使用的bootstrap-select框架,这个功能比较多,主要是可以指定下拉列表每一页显示几条数据,来防止下拉菜单过长)
首先将学院数组逐条加入到select中作为option,然后添加监听器,当select改变时,动态更改该学院下的班级列表,
至此可以获取到前台用户想要查询的班级号(我校课表接口需要班级号),用Ajax与后台进行交互
后台爬虫
利用前台传过来的班级号,带着前面存储下来的cookie(不带的话会被踢出去
.)进行请求,
由于每一次请求需要较长时间,所以使用了MySQL存下来每个班的课表信息,以后如果要查的信息数据库中有就不用了爬了!!
此部分遇到的问题
爬取的数据怎么处理emm?
- 只能说好乱又是数组又是对象的,只能静下心来一层一层分析,将无用数据剔除
存数据库(此问题纯粹是因为数据库没学好)
- 最开始用的
varchar
然后发现只存了一部分,才发现存不下!!我以为这个就是无限制的,但是都想改用文件存了~,然后发现字段改成txt
就好了
- 最开始用的
有的时候由于网络问题爬取失败
- 用了一个try catch
课表界面的编写
先简单说一下传回来的数据主要字段内容:课程名,课程地点,上课时间(周几),开始节数,持续节数
界面设计,用了table 给格子设置了固定的宽高(宽是百分比平分的)
遍历数据,根据持续时间将开始节数与下面的单元格合并,并写上课程信息。
设计样式:主要是一个多颜色背景,使用了颜色数组,每一个课程的背景从数组中选一个(用的取余方式,没用随机),添加一个border-radius
添加点击事件点击后使用bootstrap的弹窗进行一个详细信息的展示
遇到的问题
表格边框设定
字体太大了(因为手机端为主,浏览器有默认最小字体12px)采用了12px 再利用css进行缩小
font-size: 12px; |
由于课程块的展示会改变原有样式,下次查询的时候如果不清除就会错乱,方便起见,将初始内容用字符串保存,每次查询将固定的内容插入,之后就可以自由修改了,也不会影响下一次内容
待解决问题
明知有bug却解决不了哎,就是课程冲突问题,如果同一时间段课表上有两个课程,就会错乱,暂未解决,目前大概思路有两条
一是提前处理数据,将同一时间的数据合并;二是再对单元格进行切分,并排显示
由于最近要准备国电赛,不想写了,而且看了看新生课表绝大部分不会出现这个bug,之后有时间再改吧(啊不就是懒)
默默的加上了一句,请以开学后的实际课表为主,防止到时候按这个上课导致上错课或不知道上课,罪过罪过