其实,自己是一直打算爬取教务系统的,可是懒啊懒,懒啊懒,就一直懒到现在了。所以,寒假开始,痛改前非,重新做人,就稍微接触了一些python的知识,用来爬取每个学生都梦寐以求的教务系统。
前期准备
教务系统页面解析
首先,我们看看,教务系统页面长啥样?
这里,我们需要注意两点:
- 验证码的获取。
- 登陆时提交的信息。
验证码获取
这里,我们只需要进行抓包即可,这里我选择使用Fiddler进行抓包。首先打开Fiddler,然后刷新一下教务系统的界面即可。
我们在这里能够看到,获取验证码的URL是:http://210.42.121.241/servlet/GenImg
所以,我们就可以这样一步一步来获取我们需要的信息。
- 提交请求到:http://210.42.121.241/servlet/GenImg
- 下载验证码到本地,进行读取。(因为我也是刚接触python,所以这里就下载下来手动读取了,后面学习过程中,我会尝试用机器进行读取的)
- 输入验证码,提交到登陆请求,保存cookies。(这一步是很重要的)
登陆时提交信息
怎么取提交道路请求呢,我们继续来抓包。先清空Fiddler中的信息,然后在网页上输入学号,密码,验证码,点击登陆,就可以看到抓包信息了。
提交的请求包括三个参数:
{ id: 学号 pwd: 密码 xdvfb: 验证码 }
这样,我们就可以模拟取提交请求,并登陆到我们的教务系统啦~
模拟登陆
好,那么我们现在就用python开始模拟登陆。
def get_cookie():
# 验证码地址和登陆地址
base_url = "http://210.42.121.241/servlet/GenImg"
login_url = "http://210.42.121.241/servlet/Login"
# 将cookie绑定到一个opener,cookie由cookielib自动管理
cookie = cookielib.MozillaCookieJar("file.txt")
handler = urllib2.HTTPCookieProcessor(cookie)
opener = urllib2.build_opener(handler)
# 用户名和密码
username = "xxxxxxxxxxxxxxx"
password = "xxxxxxxxxxxxxxx"
# 用opener访问验证码地址,获取验证码
picture = opener.open(base_url).read()
# 保存验证码到本地
local = open("image.jpg", "wb")
local.write(picture)
local.close()
# 输入验证码,并构造表单
secret_code = raw_input("请输入验证码:")
data = {
'id': 'xxxxxxxxxxxx',
'pwd': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'xdvfb': secret_code
}
# 根据抓包信息,构造headers
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Content-Length': 64,
'Content-Type': 'application/x-www-form-urlencoded',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}
# 获取数据,保存