之前用过java实现选课功能,现在在学习python,所以想要用python也实现一下。因为本人是广大学生,所以用广大教务系统演示。
本文仅供学习使用,请勿用于其他用途。

首先打开 数字广大
然后打开浏览器开发者工具输入账号密码登录广大主页,查看请求头信息,Content-Type为application/x-www-form-urlencoded,如下图所示

查看登录请求的url以及所需要提交的参数

请求参数在上一个请求的网页中获得,也就是数字广大的html源码上可以获得

查看登录参数与网页源码对应关系

    #根据上面图片的特征通过html源码截取登录参数def get_login_param(self, html, key, special=False):flag = Noneif special is False:flag = '"' + key + '" value="'else:flag = '"' + key + '" accesskey="l" value="'start = html.find(flag)if start != -1:start += len(flag)temp_string = html[start:]end = temp_string.find('"')if end != -1:result = temp_string[:end]return resultreturn None
项目中用到requests库,用requests库中的session可以很自动处理cookie,所以在整个过程中需要保持用同一个session
 #获取session的方法def get_session(self, file="cookies.hylee"):  # 获取当前会话,通过session可自动管理cookieif self.session is None:self.session = requests.Session()self.session.cookies = HC.LWPCookieJar(filename=file)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)return self.session
执行登录操作
    # 登录广大主页def login(self, username, password):session = self.get_session()login_url = 'https://cas.gzhu.edu.cn/cas_server/login'response = session.get(login_url)login_page = response.text# login_page = response.read().decode("utf-8")  # 获取登录页面的源码captcha = self.get_login_param(login_page, 'captcha')warn = self.get_login_param(login_page, 'warn')lt = self.get_login_param(login_page, 'lt')execution = self.get_login_param(login_page, 'execution')_eventId = self.get_login_param(login_page, '_eventId')submit = self.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}r = session.post(login_url, data=login_params)# print(r.text)if r.text.find("主页") != -1:print("登录广大主页成功")return Trueelse:print("登录广大主页失败")return False
为了在选课的时候不用频繁的登录和获取课程,在本项目中会把cookie和获取到的课程保存到本地,之后需要的话可以直接加载进来而不需要重新获取
    #从文件中加载cookie信息,并添加到session中def load_cookies(self, file_path="cookies.hylee"):self.session = requests.session()self.session.cookies = HC.LWPCookieJar(filename=file_path)try:self.session.cookies.load(ignore_discard=True)except:print("cookie文件不存在")
登录成功以后会跳转到广大主页,直接点击教务系统的话会在新窗口打开,这样chrome浏览器就不能抓到数据包,所以要修改网页源码,将target属性去掉,使其在原来的标签页打开,具体步骤看下面的截图


去掉target属性以后点击教务系统,并抓取数据包,第一个url即为教务系统的url

获取教务系统url地址后直接通过session访问教务系统登录
     r = self.session.get("http://jwxt.gzhu.edu.cn/sso/lyiotlogin")  # 登录教务系统if r.text.find("广州大学教学综合信息服务平台") != -1:print("登录教务系统成功")self.session.cookies.save(ignore_discard=True, ignore_expires=True)self.get_cause_types()else:print("登录教务系统失败")
登录教务系统以后点击自主选课

查看自主选课html网页源代码,可以知道不同课程有不同的特征值,而且每个年级都不一样

根据上面的网页源码获取课程类型的特征信息,并保存到文件中,下次可以直接从本地文件中获取数据
    # 获取课程类型(体育、主修、选修)# queryCourse(this,'01','90BF46F4F75374F8E053206411AC28F7')# 获取 01 90BF46F4F75374F8E053206411AC28F7两个重要字符串def get_modules(self, html, file_path="modules.hylee"):result = []key = "queryCourse("start = html.find(key)if start != -1:start += len(key)end = html.find(")", start)while (start != -1) and (end != -1):s = html[start:end].split(",")  # 根据逗号分割字符串result.append([s[1].replace("'", ""), s[2].replace("'", "")])  # 去除单引号if end == -1:breakstart = html.find(key, end)if start == -1:breakstart += len(key)end = html.find(")", start)if len(result) != 0:with open(file_path, 'w', encoding="utf-8") as file:  # 将数据写到文件中file.write(json.dumps(result))count = 1for item in result:print("课程类型" + str(count), item)count += 1return result  # 将结果返回
可以通过本地文件或者访问教务系统获得课程类型特征信息
    # 选课初始化参数和模块def init_modules_and_params(self, module_from_file=False, module_file_path="modules.hylee"):select_cause_url = "http://jwxt.gzhu.edu.cn/jwglxt/xsxk/zzxkyzb_cxZzxkYzbIndex.html?gnmkdm=N253512&layout=default"  # 点击自主选课请求的urlself.html = self.session.get(select_cause_url).text  # 获取自主选课html页面if module_from_file is True:  # 本地加载课程类型self.load_modules(module_file_path)else:self.modules = self.get_modules(self.html)  # 获取课程的类型 体育 选修 主修self.public_params = self.get_public_params(self.html)  # 自主选课页面有的参数,一般每次请求都要加上
点击查询按钮以后可以查看相应的数据包查看请求url以及需要提交的参数等信息

因为选课需要很多的参数也需要抓很多包,所以剩下的大家可以自行探索,思路在文章中已经写的比较具体了,具体实现代码请转到我的github项目查看,有能力的朋友还可以通过本项目生成的cookie文件和其他课程文件信息用web压力测试工具进行选课,扫描下面二维码可以查看我的个人博客,原创文章,禁止转载,欢迎转发

微信公众号:小海电脑

python爬取高校课程信息进行选课实战相关推荐

  1. python爬取MOOC课程信息

    MOOC课程信息爬取 时间 :2019-10-12 一.任务与目标 网站地址 http://www.imooc.com/course/list/ 2. 采用scrapy爬虫框架 爬取信息包括:课程名称 ...

  2. 网络爬虫---爬取MOOC课程信息并做一个可视化

    文章目录 爬取MOOC课程信息并做一个可视化 一.目标 二.知识要求 三.思路分析 1.观察网页源代码,看里面是否有关于具体课程的信息 2.抓包分析与自动翻页 3.用PhantonJS构造模拟浏览器 ...

  3. 用selenium制作爬虫爬取教务课程信息

    https://apriljia.com/2018/09/26/%E7%94%A8selenium%E5%88%B6%E4%BD%9C%E7%88%AC%E8%99%AB%E7%88%AC%E5%8F ...

  4. python爬取自如房间信息(一)

    使用python和selenium+Chrome Headless爬取自如房间信息,并将结果存储在MongoDB中.其中最麻烦的应该是每间房的价格,因为自如是用一张图片和offset来显示价格,所以不 ...

  5. 2021最新 python爬取12306列车信息自动抢票并自动识别验证码(三)购票篇

    项目前言 tiebanggg又来更新了,项目--[12306-tiebanggg-master]注:本项目仅供学习研究,如若侵犯到贵公司权益请联系我第一时间进行删除:切忌用于一切非法途径,否则后果自行 ...

  6. php爬取房源,用python爬取二手房交易信息并进行分析

    用python爬取二手房交易信息并分析第一步:编写爬虫 爬取某平台上海市十个区共900条二手房的交易信息#爬取上海十个区的二手房价信息 import requests from bs4 import ...

  7. 2021最新python爬取12306列车信息自动抢票并自动识别验证码

    项目描述 项目前言 tiebanggg又来更新了,项目--[12306-tiebanggg-master]注:本项目仅供学习研究,如若侵犯到贵公司权益请联系我第一时间进行删除:切忌用于一切非法途径,否 ...

  8. python爬取12306列车信息自动抢票并自动识别验证码(一)列车数据获取篇

    项目前言 自学python差不多有一年半载了,这两天利用在甲方公司搬砖空闲之余写了个小项目--[12306-tiebanggg-master].注:本项目仅供学习研究,如若侵犯到贵公司权益请联系我第一 ...

  9. python爬取12306列车信息自动抢票并自动识别验证码(二)selenium登录验证篇

    项目前言 自学python差不多有一年半载了,这两天利用在甲方公司搬砖空闲之余写了个小项目--[12306-tiebanggg-master]注:本项目仅供学习研究,如若侵犯到贵公司权益请联系我第一时 ...

  10. python爬取天猫商品信息

    python爬取天猫商品信息 主要信息有:商品名,价格,月销量,评论数,人气值,店铺评分 以智能手机为例! 首先,发掘网址规律: 第二页的网址如上 第三页的网址如上 注意网址中的数字(靠近中间位置): ...

最新文章

  1. 与大佬零距离交流,在行业报告留名,智源社区招募兼职编辑!
  2. C语言打印文件数据,用C语言输出文件内所有数据
  3. 未来,仅凭几个前端工程师,就能 hold 住一家企业吗?
  4. 心动网络:PolarDB助力心动网络打造爆款手游
  5. 普通话转粤语_语音转文字评测:几款语音转文字app,你了解多少?
  6. 五千的手机和两三千的手机使用起来有什么不一样?有必要买贵的吗?
  7. TensorFlow 2.0开发者测试版来啦,正式版推出指日可待
  8. centos7.2安装五笔输入法的方法(king已测)
  9. list集合排序_Java面试第七部分 Java的集合
  10. (转)详解HTML网页源码的charset格式
  11. OpenCV + VS + Python
  12. 蓝天模具风扇调速软件_联力UNI FAN SL120风扇体验:模组化拼装的风扇
  13. 3D制图软件中怎么设计凸轮?3D设计凸轮教程
  14. No.1大数据入门 | 环境搭建:VM、CentOS7安装及网络配置
  15. 浙江工商大学计算机研究生院,浙江工商大学研究生院
  16. 三只松鼠营收持续下滑:市值两天缩水28亿元,能否熬过漫漫转型路
  17. 炫龙银魂t1配置_炫龙银魂T1,不一样的外观一样的强悍
  18. 完美解决Mac无法写入NTFS硬盘——Mounty for NTFS
  19. python zxing 识别条码_Python zxing 库解析(条形码二维码识别)
  20. cad快速选择命令快捷键_CAD快捷键命令:倒角的使用技巧

热门文章

  1. [转]windows 7 professional 64 bit SP1 change system language(sucess)
  2. 再谈Spring(一):Bean的作用域
  3. Redis入门总结(二):主从复制,事务和发布订阅
  4. 计算机画图 教学反思,画图教学反思
  5. webrtc VAD 算法
  6. 手机和工业计算机运算能力对比,手机cpu和电脑cpu差距有多大_手机cpu跟电脑cpu差多少...
  7. 2021年最新微博移动版网页链接自动跳转pc版网页链接软件【私信版】
  8. 高分一号/二号/六号定标系数
  9. IDEA常用插件、设置、注释
  10. 0002计算机组成原理与体系结构02