python爬取高校课程信息进行选课实战

发布时间:2026/7/28 19:26:22
python爬取高校课程信息进行选课实战 之前用过java实现选课功能现在在学习python所以想要用python也实现一下。因为本人是广大学生所以用广大教务系统演示。本文仅供学习使用请勿用于其他用途。首先打开数字广大然后打开浏览器开发者工具输入账号密码登录广大主页查看请求头信息Content-Type为application/x-www-form-urlencoded,如下图所示查看登录请求的url以及所需要提交的参数请求参数在上一个请求的网页中获得也就是数字广大的html源码上可以获得查看登录参数与网页源码对应关系#根据上面图片的特征通过html源码截取登录参数defget_login_param(self,html,key,specialFalse):flagNoneifspecialisFalse:flagkey valueelse:flagkey accesskeyl valuestarthtml.find(flag)ifstart!-1:startlen(flag)temp_stringhtml[start:]endtemp_string.find()ifend!-1:resulttemp_string[:end]returnresultreturnNone项目中用到requests库,用requests库中的session可以很自动处理cookie所以在整个过程中需要保持用同一个session#获取session的方法defget_session(self,filecookies.hylee):# 获取当前会话通过session可自动管理cookieifself.sessionisNone:self.sessionrequests.Session()self.session.cookiesHC.LWPCookieJar(filenamefile)headers{# Content-Type: application/x-www-form-urlencoded, # post请求默认类型可以不加user-agent:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0}self.session.headers.update(headers)returnself.session执行登录操作# 登录广大主页deflogin(self,username,password):sessionself.get_session()login_urlhttps://cas.gzhu.edu.cn/cas_server/loginresponsesession.get(login_url)login_pageresponse.text# login_page response.read().decode(utf-8) # 获取登录页面的源码captchaself.get_login_param(login_page,captcha)warnself.get_login_param(login_page,warn)ltself.get_login_param(login_page,lt)executionself.get_login_param(login_page,execution)_eventIdself.get_login_param(login_page,_eventId)submitself.get_login_param(login_page,submit,True)login_params{username:username,password:password,captcha:captcha,warn:warn,lt:lt,execution:execution,_eventId:_eventId,submit:submit}rsession.post(login_url,datalogin_params)# print(r.text)ifr.text.find(主页)!-1:print(登录广大主页成功)returnTrueelse:print(登录广大主页失败)returnFalse为了在选课的时候不用频繁的登录和获取课程在本项目中会把cookie和获取到的课程保存到本地之后需要的话可以直接加载进来而不需要重新获取#从文件中加载cookie信息并添加到session中defload_cookies(self,file_pathcookies.hylee):self.sessionrequests.session()self.session.cookiesHC.LWPCookieJar(filenamefile_path)try:self.session.cookies.load(ignore_discardTrue)except:print(cookie文件不存在)登录成功以后会跳转到广大主页直接点击教务系统的话会在新窗口打开这样chrome浏览器就不能抓到数据包所以要修改网页源码将target属性去掉使其在原来的标签页打开具体步骤看下面的截图去掉target属性以后点击教务系统并抓取数据包第一个url即为教务系统的url获取教务系统url地址后直接通过session访问教务系统登录rself.session.get(http://jwxt.gzhu.edu.cn/sso/lyiotlogin)# 登录教务系统ifr.text.find(广州大学教学综合信息服务平台)!-1:print(登录教务系统成功)self.session.cookies.save(ignore_discardTrue,ignore_expiresTrue)self.get_cause_types()else:print(登录教务系统失败)登录教务系统以后点击自主选课查看自主选课html网页源代码可以知道不同课程有不同的特征值而且每个年级都不一样根据上面的网页源码获取课程类型的特征信息并保存到文件中下次可以直接从本地文件中获取数据# 获取课程类型体育、主修、选修# queryCourse(this,01,90BF46F4F75374F8E053206411AC28F7)# 获取 01 90BF46F4F75374F8E053206411AC28F7两个重要字符串defget_modules(self,html,file_pathmodules.hylee):result[]keyqueryCourse(starthtml.find(key)ifstart!-1:startlen(key)endhtml.find(),start)while(start!-1)and(end!-1):shtml[start:end].split(,)# 根据逗号分割字符串result.append([s[1].replace(,),s[2].replace(,)])# 去除单引号ifend-1:breakstarthtml.find(key,end)ifstart-1:breakstartlen(key)endhtml.find(),start)iflen(result)!0:withopen(file_path,w,encodingutf-8)asfile:# 将数据写到文件中file.write(json.dumps(result))count1foriteminresult:print(课程类型str(count),item)count1returnresult# 将结果返回可以通过本地文件或者访问教务系统获得课程类型特征信息# 选课初始化参数和模块definit_modules_and_params(self,module_from_fileFalse,module_file_pathmodules.hylee):select_cause_urlhttp://jwxt.gzhu.edu.cn/jwglxt/xsxk/zzxkyzb_cxZzxkYzbIndex.html?gnmkdmN253512layoutdefault# 点击自主选课请求的urlself.htmlself.session.get(select_cause_url).text# 获取自主选课html页面ifmodule_from_fileisTrue:# 本地加载课程类型self.load_modules(module_file_path)else:self.modulesself.get_modules(self.html)# 获取课程的类型 体育 选修 主修self.public_paramsself.get_public_params(self.html)# 自主选课页面有的参数,一般每次请求都要加上点击查询按钮以后可以查看相应的数据包查看请求url以及需要提交的参数等信息因为选课需要很多的参数也需要抓很多包所以剩下的大家可以自行探索思路在文章中已经写的比较具体了具体实现代码请转到我的github项目查看有能力的朋友还可以通过本项目生成的cookie文件和其他课程文件信息用web压力测试工具进行选课扫描下面二维码可以查看我的个人博客原创文章禁止转载欢迎转发微信公众号:小海电脑