最近在学习爬虫的过程中,读了不少相关博文,感觉收获良多。
前两天刚刚动手写了一个爬取郑州大学个人成绩并计算平均绩点的程序,特意拿到这里来与大家分享。
虽然写的是针对郑州大学教务系统的爬虫,但我相信只要稍作修改就可以应用于多数大学的教务系统了。
首先说一下程序执行的过程:
1、打开教务系统登录界面,获取相应的
url
以及表单域需要填写选项的名称。2、填写必要信息、设置
cookie
,模拟浏览器登录系统3、利用正则表达式获取不同学期成绩页面对应的
url
,并保存。4、循环打开刚刚保存的不同学期成绩页面的
url
,利用正则表达式匹配课程、成绩信息。5、计算平均绩点并输出
从上面的流程可以看出,整个过程涉及到的比较复杂的地方只有登录以及正则表达式的匹配,下面我们一步一步实现我们的需求。
为了很好地讲解操作步骤,我们先设计一个类,名字叫做ZZU
并设置以下成员:
|
|
第一步:获取登录页面url
及表单信息
- 打开教务系统,进入登录界面,利用
F12
查看网页源码信息,提取表单域内容:
从上面的图片可以看出,我们需要填写的内容有:
nianji(年级)
、xuehao(学号)
、mima(密码)
、selec(登录页面)
几个选项,在这里我们选择令selec
为http://jw.zzu.edu.cn/scripts/qscore.dll/search
即进入选课系统。因此我们可以为
ZZU
添加一个变量叫做postdata
用来存储以上信息,内容为:
|
|
第二步:设置cookie
并登录
- 这里可能看起来比较难,其实只用调用相关函数即可
|
|
第三步:利用正则表达式获取所有学期页面的url
- 这里需要我们能够有效提取出所有学期页面
url
的共同特征,之后才能完成匹配
- 对于我校郑州大学的系统,可以发现不同学期
url
只是search?userid=
后面的参数不同而已;因此我们可以利用regx = re.compile('href="(http://jw.zzu.edu.cn/scripts/qscore.dll/search.*?)">')
来匹配所有的url
|
|
第四步:利用正则表达式获取课程、成绩相关信息
- 同上一步,我们先来提取课程、成绩信息的特征,
- 可以发现课程、成绩信息是分别被五个
<td>
标签包住的,因此我们可以这样匹配re.compile('<td.*?>(.*?)</td><td.*?>(.*?)</td><td.*?>(.*?)</td><td.*?>(.*?)</td><td.*?>(.*?)</td>', re.U)
,不了解re.U
含义的可以移步这里python爬虫基础教程巩固下。
|
|
第五步:计算平均绩点
- 想一下,如果我们能获得一学期的所有成绩,那么我们就一定可以获取所有学期成绩,从而计算
GPA
上面说的零零碎碎,可能不是很清楚,下面附上完整代码以及必要注释:
|
|
下面是我的GPA查询结果: