#Cookie池中保存账号和登录后的Cookie信息,并且还定时检查每个Cookie的有效性,如果有无效的Cookie,就删除
# 该Cookie并模拟生成新的Cookie,还要包含获取随机Cookie的接口
import requests
from PIL import Image
from bs4 import BeautifulSoup
import copy
import time
import re
import osclass Spider:class Lesson:def __init__(self, name, code, teacher_name, Time, number):self.name = nameself.code = codeself.teacher_name = teacher_nameself.time = Timeself.number = numberdef show(self):print('  name:' + self.name + '  code:' + self.code + '  teacher_name:' + self.teacher_name + '  time:' + self.time)def __init__(self, url):self.__uid = ''self.__real_base_url = ''self.__base_url = urlself.__name = ''self.__base_data = {'__EVENTTARGET': '','__EVENTARGUMENT': '','__VIEWSTATE': '','ddl_kcxz': '','ddl_ywyl': '','ddl_kcgs': '','ddl_xqbs': '','ddl_sksj': '','TextBox1': '','dpkcmcGrid:txtChoosePage': '1','dpkcmcGrid:txtPageSize': '200',}self.__headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36',}self.session = requests.Session()self.__now_lessons_number = 0def __set_real_url(self):request = self.session.get(self.__base_url, headers=self.__headers)real_url = request.urlif real_url != 'http://119.145.67.59:7889' and real_url != 'http://119.145.67.59:7889/index.apsx':  # 湖南工业大学self.__real_base_url = real_url[:len(real_url) - len('default2.aspx')]else:if real_url.find('index') > 0:self.__real_base_url = real_url[:len(real_url) - len('index.aspx')]else:self.__real_base_url = real_urlreturn requestdef __get_code(self):if self.__real_base_url != 'http://119.145.67.59:7889':request = self.session.get(self.__real_base_url + 'CheckCode.aspx', headers=self.__headers)else:request = self.session.get(self.__real_base_url + 'CheckCode.aspx?', headers=self.__headers)with open('code.jpg', 'wb')as f:f.write(request.content)im = Image.open('code.jpg')im.show()print('Please input the code:')code = input()return codedef __get_login_data(self, uid, password):self.__uid = uidrequest = self.__set_real_url()soup = BeautifulSoup(request.text, 'lxml')form_tag = soup.find('input')__VIEWSTATE = form_tag['value']code = self.__get_code()data = {'__VIEWSTATE': __VIEWSTATE,'txtUserName': self.__uid,'TextBox2': password,'txtSecretCode': code,'RadioButtonList1': '学生'.encode('gb2312'),'Button1': '','lbLanguage': '','hidPdrs': '','hidsc': '',}return datadef login(self, uid, password):while True:data = self.__get_login_data(uid, password)if self.__real_base_url != 'http://119.145.67.59:7889':request = self.session.post(self.__real_base_url + 'default2.aspx', headers=self.__headers, data=data)else:request = self.session.post(self.__real_base_url + 'index.aspx', headers=self.__headers, data=data)soup = BeautifulSoup(request.text, 'lxml')if request.status_code != requests.codes.ok:print('4XX or 5XX Error,try to login again')time.sleep(0.5)continueif request.text.find('验证码不正确') > -1:print('Code error,please input again')continueif request.text.find('密码错误') > -1:print('Password may be error')return Falseif request.text.find('用户名不存在') > -1:print('Uid may be error')return Falsetry:name_tag = soup.find(id='xhxm')self.__name = name_tag.string[:len(name_tag.string) - 2]print('欢迎' + self.__name)self.__enter_lessons_first()return Trueexcept:print('Unknown Error,try to login again.')time.sleep(0.5)continuedef __enter_lessons_first(self):data = {'xh': self.__uid,'xm': self.__name.encode('gb2312'),'gnmkdm': 'N121103',}self.__headers['Referer'] = self.__real_base_url + 'xs_main.aspx?xh=' + self.__uidrequest = self.session.get(self.__real_base_url + 'xf_xsqxxxk.aspx', params=data, headers=self.__headers)self.__headers['Referer'] = request.urlsoup = BeautifulSoup(request.text, 'lxml')self.__set__VIEWSTATE(soup)selected_lessons_pre_tag = soup.find('legend', text='已选课程')selected_lessons_tag = selected_lessons_pre_tag.next_siblingtr_list = selected_lessons_tag.find_all('tr')[1:]self.__now_lessons_number = len(tr_list)try:xq_tag = soup.find('select', id='ddl_xqbs')self.__base_data['ddl_xqbs'] = xq_tag.find('option')['value']except:passdef __set__VIEWSTATE(self, soup):__VIEWSTATE_tag = soup.find('input', attrs={'name': '__VIEWSTATE'})self.__base_data['__VIEWSTATE'] = __VIEWSTATE_tag['value']def __get_lessons(self, soup):lesson_list = []lessons_tag = soup.find('table', id='kcmcGrid')lesson_tag_list = lessons_tag.find_all('tr')[1:]for lesson_tag in lesson_tag_list:td_list = lesson_tag.find_all('td')code = td_list[0].input['name']name = td_list[1].stringteacher_name = td_list[3].stringTime = td_list[4]['title']number = td_list[10].stringlesson = self.Lesson(name, code, teacher_name, Time, number)lesson_list.append(lesson)return lesson_listdef __search_lessons(self, lesson_name=''):self.__base_data['TextBox1'] = lesson_name.encode('gb2312')request = self.session.post(self.__headers['Referer'], data=self.__base_data, headers=self.__headers)soup = BeautifulSoup(request.text, 'lxml')self.__set__VIEWSTATE(soup)return self.__get_lessons(soup)def __select_lesson(self, lesson_list):data = copy.deepcopy(self.__base_data)data['Button1'] = '  提交  '.encode('gb2312')for lesson in lesson_list:code = lesson.codedata[code] = 'on'request = self.session.post(self.__headers['Referer'], data=data, headers=self.__headers)soup = BeautifulSoup(request.text, 'lxml')self.__set__VIEWSTATE(soup)error_tag = soup.html.head.scriptif not error_tag is None:error_tag_text = error_tag.stringr = "alert\('(.+?)'\);"for s in re.findall(r, error_tag_text):print(s)print('已选课程:')selected_lessons_pre_tag = soup.find('legend', text='已选课程')selected_lessons_tag = selected_lessons_pre_tag.next_siblingtr_list = selected_lessons_tag.find_all('tr')[1:]self.__now_lessons_number = len(tr_list)for tr in tr_list:td = tr.find('td')print(td.string)def run(self):print('请输入搜索课程名字')lesson_name = input()lesson_list = self.__search_lessons(lesson_name)print('请输入想选的课的id,id为每门课程开头的数字,如果没有课程显示,代表公选课暂无')for i in range(len(lesson_list)):print(i, end='')lesson_list[i].show()select_id = int(input())lesson_list = lesson_list[select_id:select_id + 1]while True:try:number = self.__now_lessons_numberself.__select_lesson(lesson_list)if self.__now_lessons_number > number:breakexcept:print("抢课失败,休息0.5秒后继续")time.sleep(0.5)if __name__ == '__main__':print('请输入你们学校教务系统的地址,不用加上前面的http://')url = input()url = 'http://' + urlspider = Spider(url)print('请输入学号')uid = input()  # 学号print('请输入密码')password = input()  # 密码if (spider.login(uid, password)):spider.run()os.system("pause")

运行结果

Python:正方系统抢课相关推荐

  1. python模拟登录教务系统_用Python实现模拟登录正方教务系统抢课

    最近学校开始选课,但是如果选课时间与自己的事情冲突,这时候就可以使用Python脚本自助抢课,抢课的第一步即是模拟登录,需要模拟登录后保存登录信息然后再进行操作. 而且整个流程是比较简单,这是因为正方 ...

  2. 用Python实现模拟登录正方教务系统抢课

    最近学校开始选课,但是如果选课时间与自己的事情冲突,这时候就可以使用Python脚本自助抢课,抢课的第一步即是模拟登录,需要模拟登录后保存登录信息然后再进行操作. 而且整个流程是比较简单,这是因为正方 ...

  3. 用 Python 实现模拟登录正方教务系统抢课

    (点击上方蓝字,快速关注我们) 作者:小苏打 https://vhyz.me/2018/06/12/用Python实现模拟登录正方教务系统抢课/ 最近学校开始选课,但是如果选课时间与自己的事情冲突,这 ...

  4. asp 退出登录修改cookie能进入后台_用Python实现模拟登录正方教务系统抢课

    6月23日更新:由于国内高校正方教务系统或多或少都会有所不同,所以细节地方还是需要自己修改的,我这个过程也只是一个案例,但这其中的本质上是不变的,即是抓包分析. 如果有什么不懂的,可以在评论区评论,或 ...

  5. python抢课脚本 验证码_用Python实现模拟登录正方教务系统抢课

    最近学校开始选课,但是如果选课时间与自己的事情冲突,这时候就可以使用Python脚本自助抢课,抢课的第一步即是模拟登录,需要模拟登录后保存登录信息然后再进行操作. 而且整个流程是比较简单,这是因为正方 ...

  6. 用Python模拟登录学校教务系统抢课

    --  Illustrations by Vladislav Solovjov -- ♚ 作者:小苏打 博客地址:https://vhyz.me GitHub地址:github.com/vhyz/ZF ...

  7. 抢课不再凭手速和运气,Python模拟登录学校教务系统抢课

    前言: 最近学校开始选课,但是如果选课时间与自己的事情冲突,这时候就可以使用Python脚本自助抢课,不用再担心手速跟不上,抢啥中啥.不用再承受抢不中想去的课,最后被调剂到各种"灭绝师太&q ...

  8. ZUCC 正方教务系统 抢课脚本 抢课流程实现

    ZUCC 正方教务系统 抢课脚本 抢课流程实现 新版ZUCC正方教务系统抢课脚本的流程分析与实现,文章结尾有完整项目的所有代码. 个人博客文章链接 流程分析 账号登录进入首页 模拟请求进入计划内选课界 ...

  9. 基于正方系统的抢课软件教程系列一模拟登录3之验证码识别

    在上一篇可以进入系统后,我们发现我们还要输入验证码这是多么让人可恶的一件事呀!有时我们选课时就是在登录的这个门口进不行,那从何说起去选课页面呀!因此我们迫切要一种方法直接通过我们的帐号密码就可以选课! ...

最新文章

  1. Oracle 10.2.0.5.4 Patch Set Update (PSU) – Patch No: p12419392
  2. 不能交换到解决jenkins用户的问题
  3. 电话光端机应用范围解析!电话光端机主要应用在哪些领域?
  4. Linux Socket网络通信示例
  5. Ubuntu18.04安装可视化软件Pyviz
  6. 算法与数据结构1800题 图
  7. 【Matlab水果识别】形态学水果大小识别【含GUI源码 920期】
  8. 2022-06微软漏洞通告
  9. 计算机网络-常用英文简写与名词解释
  10. 深度学习:view size is not compatible with input tensor‘s size and stride (at least one dimension spans a
  11. 深度残差收缩网络(Deep Residual Shrinkage Networks for Fault Diagnosis )
  12. 文件上传漏洞靶场upload-labs学习(pass11-pass15)
  13. 江南百景图过Root检测
  14. matlab三维螺旋,Matlab——图形绘制——三维立体图形 剔透玲珑球 动态图——彗星状轨迹图...
  15. zstuoj (浙理工) 孙壕请一盘青岛大虾呗
  16. nmn修复脑神经是真的吗,nmn到底有没有效,看这一篇就够了
  17. actuator微服务信息完善
  18. CHM文档(jdk帮助文档)打开显示空白的解决办法
  19. 关于使用Restlet的升级
  20. 【失败】尝试改hosts突破迅雷离线的封锁

热门文章

  1. 光伏逆变器行业研究及十四五规划分析报告
  2. npp夜光数据介绍 viirs_1.夜间灯光遥感数据概述
  3. ampak系列wifi模组使用注意点
  4. Properties
  5. ocsp和ldap 区别_HTTPS 时代 - 动态加载证书和 OCSP stapling - 《OpenResty 最佳实践》 - 书栈网 · BookStack...
  6. oracle收入 物料,常用物料成本报表.ppt
  7. 封装uniapp网络请求, 统一管理接口和怎么使用(完整版)
  8. 自动编码器python_算法进阶(一)之自动编码器
  9. AT2401C与RFX2401C的开发区别
  10. Python——对区间进行等间距取数