ZUCC 正方教务系统 抢课脚本 抢课流程实现
新版ZUCC正方教务系统抢课脚本的流程分析与实现,文章结尾有完整项目的所有代码。
个人博客文章链接
流程分析
账号登录进入首页- 模拟请求进入计划内选课界面
- 模拟点击进入某个课程,爬取课程时间分布信息
- 模拟发送抢课数据包
初始化CATCH_PLANNED_COURSE.py这个文件
import LOGIN
from bs4 import BeautifulSoup
import time
class PlannedCourse:
def __init__(self, account):
self.account = account
def enter_planned_course(self):
return
def catch_course(self):
return
def choose_course_class(self):
return
def run(self):
# 进入计划内选课界面
self.enter_planned_course()
# 爬取课程信息
self.choose_course_class()
# 模拟发包抢课
self.catch_course()
这里的account对应了登录时的账号,登录时的会话一直保存在account中,在选课的部分会通过这个会话保持和正方教务系统的连接。
进入计划内选课界面
首先我们需要知道在正常网页下我们是如何进入计划内选课界面的。
一般情况下我们会点击计划内选课进入,但是这样我们是无法获取到真正的界面的。当我们ctrl+点击计划内选课的时候会新建一个标签页,在这个页面中才是计划内选课的真正网址
下图是直接点击进入的网站
下图是ctrl+点击进入的网站
所以我们登录成功后可以直接像这个网站发送GET请求,account对象的会话内容就会转移到这个页面。
这里可以通过BeautifulSoup解析一下,确保能出现课程种类就好。
def enter_planned_course(self):
url = LOGIN.ZUCC.PlanCourageURL + "?xh=" + self.account.account_data["username"]
header = LOGIN.ZUCC.InitHeader
header["Referer"] = url
response = self.account.session.get(url=url, headers=header)
"""以下两行代码可以用先解析以下,看下当前是否在我们需要的页面"""
self.account.soup = BeautifulSoup(response.text, "lxml")
#print(self.account.soup)
#return response
能输出以下内容就证明进入了计划内选课界面
课程选择
enter_planned_course.py会返回一个包含课程信息的response,这个response会以参数的形式出现在choose_course_class.py中,所以对应的地方都要更改
def choose_course_class(self,response):
return
def run(self):
# 进入计划内选课界面
response = self.enter_planned_course()
# 爬取课程信息
self.choose_course_class(response)
# 模拟发包抢课
self.catch_course()
首先我们需要选择我们要抢什么课,那我们就需要从刚才的网页中把所有的课程信息给获取出来。这个时候就要用到爬虫来帮我们获取这些网页标签。
分析之前得到的response中的网页,可以得到每个课程种类信息是以下面这种结构在html文件中呈现出来的。(下面html样例中的超链接部分我删除了)
<tr>
<td>301258</td>
<td>操作系统原理</