一、获取自己在教务处的课表,需要自己在教务处中登录自己的帐号再去查看自己课表即可,本文将通过爬虫的方式去获取课表。爬虫的方式获取课表也和我们正常的获取课表的方式差不多,都是先登录,再转到课表页面查看课表,只不过爬虫是通过代码来实现。通过代码实现也需要经过以下步骤。
1、模拟登录教务处
2、访问课表页面并下载其源代码
3、从课表页面源代码中提取出课表信息
二、实现上述步骤可以通过各种语言去实现,如java、C#、php、 python 。本文将采用python实现。要实现上述步骤需要用到python中的两个库 。一个是网络请求库requests,一个是解析库pyquery,以下是安装方法。
1、pip3 install requests
2、pip3 install pyquery
安装好这些库之后就可以开始写代码了
三、模拟登录教务处
通过查看教务网的登录页面的源代码可以发现在登录的时候需要提交一些数据,用户名,密码,类别。
![](https://img.haomeiwen.com/i7538942/d7c739bac64ca0cc.png)
所以可以构造数据如下:
data={
"user":"学号" ,
"pwd":“密码” ,
"lb": "S"
}
构造好数据后就可以直接发起登录请求了,
在python中可以使用request.post(url,data)发起post请求。
当我请求过后,发现并没有登录成功,最后发现原来是教务处在登录的前台对用户输入的密码进行了加密处理。
![](https://img.haomeiwen.com/i7538942/8a73c6c56b31898b.png)
dcode2为后台产生随机数,这个数字对加密后的结果有着决定性的作用,然而这个数字并不是固定的,每一次请求都会发变化,所以我们在使用爬虫的时候,需要保持爬虫的会话状态,不然模拟登录都不会成功,会返回密码错误的提示。
在模拟登录的时候我们需要对用户输入的密码进行加密,下面是python重写后的加密算法。
code为教务网后台产后的随机数,password为密码
def getPassword(code,password=""):
code=str(int(code)*137)
dcode=""
for i in range(1,password.__len__()+1):
dcode+=chr(ord(password[i-1:i])-i-int(code[i-1:i]))
return dcode
然后再进行模拟登录就没有问题了,下面是模拟登录的代码
userName为用户名,password为密码,accessUrl需要访问的url地址
def getInfoes(userName,passowrd,accessUrl):
client = requests.session()
client.post("http://jiaowu.sicau.edu.cn/jiaoshi/bangong/check.asp", {
"user": userName,
"pwd": getPassword(re.compile(r"dcode2=\d{10}").search(client.get("http://jiaowu.sicau.edu.cn").text).group(0).split("=")[1], passowrd),
"lb": "S"
})
return client.get(accessUrl)
这句代码的意思是获取教务网的随机数,并用随机数作为参数对用户的密码进行加密getPassword(re.compile(r"dcode2=\d{10}").search(client.get("http://jiaowu.sicau.edu.cn").text).group(0).split("=")[1],passowrd)
调用上面的方法即可获取到课表:
if __name__=="__main__":
info=getInfoes("学号","密码","http://jiaowu.sicau.edu.cn/xuesheng/gongxuan/gongxuan/kbbanji.asp")
info.encoding="gb2312"
a=pq(info.text) # 解析获取到的课表页面的源码
for tr in a("table")[5]:
print(a(tr).text()) #输出课表
结果如下:
![](https://img.haomeiwen.com/i7538942/408f7134765cca93.png)
网友评论