使用模块requests,re
爬取思路
1.模拟登录正方系统
2.爬取课表
1.requests模拟登录正方系统
F12 network可以查找到我们post的数据
TextBox1是学号,TextBox2是密码,TextBox3是验证码,从上图可以知道,登录正方系统需要学号,密码,除了学号密码,正方系统里还有隐藏的参数,我们可以查看网页源代码找到
一个是__VIEWSTATE,另一个是__VIEWSTATEGENERATOR
这时候我们就可以构造我们的post参数了,代码如下,header为上图的User_Agent
def login(): # 以字典的形式添加请求头 header = { 'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36" } # 使用get方法发送请求获取网页源码 response=requests.post("http://210.38.162.116/(wbvxup4512rto455zsbdev23)/default2.aspx", #登录 headers=header, data={'__VIEWSTATE':'dDwtMTg3MTM5OTI5MTs7PjJ06Q8x0sjwFTIugwoEgtaDQze7', '__VIEWSTATEGENERATOR':'92719903', 'TextBox1':'学号', 'TextBox2': '密码', 'RadioButtonList1': '学生', 'Button1': '' } ) s = response.content s = s.decode('gbk') #转码, s=str(s) regx = r'<span id="Label3">欢迎您:</span>' # 正则匹配 pattern = re.compile(regx) # 编译 res= re.findall(pattern, s) print(res)
post时选择学生,按钮是登录,键值是input的name属性。由于我们没有请求验证码,所以是不需要输入验证码的,这也是正方系统的漏洞吧。能跳过验证码还是简单了许多,如果需要验证码,那就需要加一个请求验证码的链接。
判断是否成功登录的方式是返回的页面是否有 欢迎您,xxx,写一个正则表达式来匹配。
当出现这样的结果就是登录成功啦。
2.爬取课表
在课表右键检查network可以找到到课表的请求链接
直接抓取里面的内容,注意编码问题,否则会乱码
def class_table(): header2 = { "Referer": "http://210.38.162.116/(wbvxup4512rto455zsbdev23)/", #课表回调头 'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36" } response = requests.post("http://210.38.162.116/(wbvxup4512rto455zsbdev23)/xskbcx.aspx?xh=161110073&xm=%D7%AF%D4%F3%E5%AB&gnmkdm=N121603",headers=header2) #获取课表 s = response.content s = s.decode('gbk') regx = r'<td [\w\W]*?>([\w\W]*?)<\/td>' # 正则匹配 pattern = re.compile(regx) # 编译 res= re.findall(pattern, s) for i in range(0,18): #去除无用的数组 res.remove(res[0]) return res
这次抓取需要再加一个回调头。通过正则和筛选就能获取到我们所需要的课表信息啦
运行结果如下
爬取正方系统其他信息的原理也是一样的。如果出现像学期选择的按钮,像登录一样post处理就可以了