朋友最近遇上选课困难,手速慢,总是抢不到心仪的课程,我目前正好找不到爬虫项目练手,于是写了个面向复旦选课系统的抢课小软件帮助朋友抢课

首先需要这些模块:

import requests
import re
import time
import schedule

第一步需要做的是通过身份认证并爬取csrf-token,在选课网站登陆后复制cookies到代码中,这是服务器识别你身份的方式,接着网站会通过生成csrf-token并将其包含在选课请求中来进一步保护信息安全;csrf-token这是网站的一道保护措施,网站根据你提交的cookie信息生成一段随机的csrf-token码,你需要将其爬取并应用到后续的请求中。

class csrfscrapy():def csrf_req(self):cookies = {'_WEU': '********','route': '***********','JSESSIONID': '***********','XK_TOKEN': '****************',}#cookie需替换,根据自己登陆后找到的cookie进行替换headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7','Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7,en-GB;q=0.6','Cache-Control': 'max-age=0','Connection': 'keep-alive','Referer': 'http://yjsxk.fudan.sh.cn/yjsxkapp/sys/xsxkappfudan/*default/index.do','Upgrade-Insecure-Requests': '1','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.46',}res = requests.get('http://yjsxk.fudan.sh.cn/yjsxkapp/sys/xsxkappfudan/xsxkHome/gotoChooseCourse.do',cookies=cookies,headers=headers,verify=False,)return resdef pares_csrf(self, res):csrf=re.findall('csrfToken\W+value=\W+([a-z0-9]+)\W', res.text)csrfstr=csrf[0]print(csrfstr)return csrfstr#从html中找到csrftokendef run(self):responce=self.csrf_req()csrfstr=str(self.pares_csrf(responce))return csrfstr

之后要解决的就是提交选课请求,注意在request.post中有个参数param(dict类型),这是时间13位时间戳,需要整合到url里一起提交;另外一个参数是data(dict类型),里面包含csrf-token和选课信息bjdm,lx,bqmc和身份认证csrfToken。其中bjdm是课程代码,lx是课程类型(数字,专业外语对应7,其他选修课10,公共选修课9),bqmc是课程所在的分类(如专业外语,其他选修课,公共选修课等),lx和bqmc钥匙可以通过自己要选的课程所在的门类进行填写,比如要选的xxx课程在公共选修课,那么'lx': '9', 'bqmc': '公共选修课’。bjdm钥匙需要在浏览器开发者模式中寻找对应的代码,后续详细说明。csrfToken钥匙则是上个部分爬取的结果。

class courceburglar():def __init__(self, csrf):self.csrf=csrfdef get_millisecond():millis = int(round(time.time() * 1000))return millisdef cource_req(self):cookies = {'_WEU': '********','route': '***********','JSESSIONID': '***********','XK_TOKEN': '****************',}#cookie需替换,根据自己登陆后找到的cookie进行替换headers = {'Accept': 'application/json, text/javascript, */*; q=0.01','Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7,en-GB;q=0.6','Connection': 'keep-alive','Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8','Origin': 'http://yjsxk.fudan.sh.cn','Referer': 'http://yjsxk.fudan.sh.cn/yjsxkapp/sys/xsxkappfudan/xsxkHome/gotoChooseCourse.do','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.46','X-Requested-With': 'XMLHttpRequest',}timestramp = courceburglar.get_millisecond()print(timestramp)params = {'_': timestramp,}data = {'bjdm': '************','lx': '7','bqmc': '专业外语','csrfToken': self.csrf,}response = requests.post('http://yjsxk.fudan.sh.cn/yjsxkapp/sys/xsxkappfudan/xsxkCourse/choiceCourse.do',params=params,cookies=cookies,headers=headers,data=data,verify=False,)print(response.status_code)def run(self):responce=self.cource_req()

如何寻找cookie:首先登陆自己选课账号,进入选课界面,f12打开开发者界面中的网络(或者network)选项卡,刷新你的浏览器,在你的开发者界面会有如下的状态,打开任意一个形如r'\w+do\?_=\d+'命名的文件的请求头(或者headers)选项卡,在request headers中包含了cookie信息,稍微加工改成dict类型,替换掉两部分代码中cookies部分.

如何寻找课程代码:清空你的开发者界面,将你的选课类别调整到你需要选的类型中,比如你要选公共选修课的课程,你将浏览器中的选项点击到公共选修课,与此同时,在开发者界面会出现响应的文件,打开形如'loadxxxxxcourceinfo.do?_=xxxxxx'文件,打开preview的选项卡,在众多检索出的课程中找到你要的课程的BJDM,并替换掉data参数里面的bjdm。

代码最后就是时间部分:通过schedule模块控制选课请求发送时间。选课系统一般是下午一点开放。

if __name__=='__main__':def job(cs):crsreq = courceburglar(cs)crsreq.run()csrf=csrfscrapy()csrftoken=csrf.run()#schedule.every(5).to(10).minutes.do(job, csrftoken) #5-10分钟随机做一次schedule.every().day.at("13:00").do(job, csrftoken)while True:schedule.run_pending()time.sleep(1)

具体参考这位大佬的内容:(10条消息) Python3学习(八):使用schedule模块定时执行任务_猪笨是念来过倒的博客-CSDN博客_schedule.run_pending()

整合起来全代码如下:

import requests
import re
import time
import scheduleclass csrfscrapy():def csrf_req(self):cookies = {'_WEU': '********','route': '***********','JSESSIONID': '***********','XK_TOKEN': '****************',}#cookie需替换,根据自己登陆后找到的cookie进行替换headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7','Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7,en-GB;q=0.6','Cache-Control': 'max-age=0','Connection': 'keep-alive','Referer': 'http://yjsxk.fudan.sh.cn/yjsxkapp/sys/xsxkappfudan/*default/index.do','Upgrade-Insecure-Requests': '1','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.46',}res = requests.get('http://yjsxk.fudan.sh.cn/yjsxkapp/sys/xsxkappfudan/xsxkHome/gotoChooseCourse.do',cookies=cookies,headers=headers,verify=False,)return resdef pares_csrf(self, res):csrf=re.findall('csrfToken\W+value=\W+([a-z0-9]+)\W', res.text)csrfstr=csrf[0]print(csrfstr)return csrfstr#从html中找到csrftokendef run(self):responce=self.csrf_req()csrfstr=str(self.pares_csrf(responce))return csrfstrclass courceburglar():def __init__(self, csrf):self.csrf=csrfdef get_millisecond():millis = int(round(time.time() * 1000))return millisdef cource_req(self):cookies = {'_WEU': '********','route': '***********','JSESSIONID': '***********','XK_TOKEN': '****************',}#cookie需替换,根据自己登陆后找到的cookie进行替换headers = {'Accept': 'application/json, text/javascript, */*; q=0.01','Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7,en-GB;q=0.6','Connection': 'keep-alive','Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8','Origin': 'http://yjsxk.fudan.sh.cn','Referer': 'http://yjsxk.fudan.sh.cn/yjsxkapp/sys/xsxkappfudan/xsxkHome/gotoChooseCourse.do','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.46','X-Requested-With': 'XMLHttpRequest',}timestramp = courceburglar.get_millisecond()print(timestramp)params = {'_': timestramp,}data = {'bjdm': '************','lx': '7','bqmc': '专业外语','csrfToken': self.csrf,}response = requests.post('http://yjsxk.fudan.sh.cn/yjsxkapp/sys/xsxkappfudan/xsxkCourse/choiceCourse.do',params=params,cookies=cookies,headers=headers,data=data,verify=False,)print(response.status_code)def run(self):responce=self.cource_req()if __name__=='__main__':def job(cs):crsreq = courceburglar(cs)crsreq.run()csrf=csrfscrapy()csrftoken=csrf.run()#schedule.every(5).to(10).minutes.do(job, csrftoken) #5-10分钟随机做一次schedule.every().day.at("13:00").do(job, csrftoken)while True:schedule.run_pending()time.sleep(1)

后续改进可以写一个可以自动生成需要的选课信息并将信息放进队列的模块,以及多线程同时发送选课请求的模块。

python实现复旦大学选课系统自动抢课神器抢课软件Courcegoblin抢课软件ver 1.0相关推荐

  1. python最简单选课系统作业_python之路——作业:学生选课系统

    一.作业要求: 选课系统: 角色:学校.学员.课程.讲师 要求: 1. 创建北京.上海 2 所学校 2. 创建linux , python , go 3个课程 , linux\py 在北京开, go ...

  2. [ python ] 作业:选课系统

    功能代码实现源地址:https://www.cnblogs.com/lianzhilei/p/5832691.html    如有侵权,立即删除 本文主要是分析 选课系统 实现思路及上面代码的实现过程 ...

  3. python编写学生选课系统程序_python面向对象编程小程序- 选课系统

    选课系统 花了一晚上写的,可能还存在不足 1.程序框架 2.文件夹建立D:/选课系统 |___api | |___common_api.py |___bil | |___common.py |___c ...

  4. 计算机毕业设计django基于python的学生选课系统-高校教务管理系统(源码+系统+mysql数据库+Lw文档)

    项目介绍 本论文主要论述了如何使用Python技术开发一个高校教务管理系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发.在引言中,作者将论述高校教务管 ...

  5. python编写学生选课系统程序卸载器_Python 简易版选课系统

    一.创建学生类 ## 创建学生类 importrandomclassStudent:def __init__(self,num,name,address,course_lst=None): self. ...

  6. python玩微信小程序游戏_使用python实现微信小程序自动签到功能

    功能描述目标 完成多账号微信小程序每天自动签到 输出 签到成功则向微信群发送签到成功的信息 否则提示用户签到失败,需手动签到 包管理 requests itchat time threading 程序 ...

  7. python选课管理系统_Python开发程序:选课系统

    程序名称: 选课系统 角色:学校.学员.课程.讲师 要求: 1. 创建北京.上海 2 所学校 2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海 ...

  8. Python开发【项目】:选课系统

    程序名称: 选课系统 角色:学校.学员.课程.讲师 要求: 1. 创建北京.上海 2 所学校 2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海 ...

  9. 【教你抢课】C++网络编程之使用Winsock2实现教务系统自动抢课程序

    一.开发环境及工具: · Microsoft Visual Studio(本程序使用的是Microsoft Visual Studio 2012) · Chrome浏览器(其他浏览器也可以) 二.原理 ...

最新文章

  1. MySQL学习总结(三)索引
  2. Linux下使用tee既在屏幕上显示输出,又把输出写进文件
  3. 深度剖析Kubernetes API Server三部曲 - part 1
  4. linux环境变量显示、添加、删除
  5. ABAP算法:找出递归的物料
  6. Android系统共享一套sdk
  7. 通俗理解tcp/ip的三次握手和四次分手
  8. 干货|机器学习零基础?不要怕,吴恩达机器学习课程笔记2-多元线性回归
  9. Ubuntu 20.10 安装 fcitx5 输入法
  10. 测试工程师,应当知晓的12项基本原则
  11. vue.js 输入框金额限制
  12. Windows下linux传盘工具,Windows下安装红旗Linux及工具盘全过程
  13. 小象大数据全套视频教程
  14. 移动硬盘文件系统错误16389
  15. CentOS6实验模板机搭建
  16. 代理模式 Proxy
  17. 为什么精英这么用脑不会累
  18. 转速闭环控制直流调速系统的仿真 matlab
  19. Flutter IconFont 使用
  20. epson打印机设置方法

热门文章

  1. leetcode每日一道(3)最多能有多少个点位于同一直线上
  2. 使用WLC+Portal完成认证
  3. Java基础语法的案例练习-编程思维的训练
  4. 如何在JAVA中构建区块链?
  5. 每日五分钟:学习编写编程语言
  6. 旁站及C段收集与利用方式
  7. 甲方安全防御体系架构图
  8. 手把手教你自己写一个Python模块,并将其发布并安装到自己的Python环境中去
  9. 现代法谱估计(2)Levinson-Durbin递推算法MATLAB及Python实现
  10. 如何加速 LaTeX 编译