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

首先需要这些模块:

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. Spring Boot @ConfigurationProperties使用指导
  2. 从Storm到Flink:大数据处理的开源系统及编程模型(文末福利)
  3. 启程 - 《每日五分钟搞定大数据》
  4. 牛客网题目——替换空格
  5. 牛客 - sequence(笛卡尔树+线段树)
  6. jQuery应用实例2:简单动画
  7. 第五百一十八天 how can I 坚持
  8. 看图了解RocksDB
  9. 中关村程序员的 996 强制加班与工作效率成正比吗?
  10. 大厨揭示Google成功秘诀:免费啤酒和寿司
  11. hibernate Restrictions 用法
  12. RobotFramework自动化测试框架-移动手机自动化测试Clear Text关键字的使用
  13. 如何自定义安装mysql_安装MySQL
  14. HTML5 Security Cheatsheet
  15. 软件评测师备考详细知识点
  16. matlab画进化树分析图,教你用ggtree绘制高颜值进化树
  17. 用聚宽量化炒股-3常用对象
  18. 上海康桥先进制造技术创业园项目远程预付费系统的应用-安科瑞耿敏花
  19. 写完十四章卡农后,莫比乌斯带属实是给巴赫玩明白了
  20. 淘宝产品3d展示-家具沙发三维模型应用

热门文章

  1. 【阿里云】轻松玩转linux服务器
  2. hadoop 透明加密先关命令
  3. 计算字符串中某段字符出现次数
  4. 用canvas实现小方块的音符跳动
  5. version 8 新特性整理
  6. linux下.run文件的安装与卸载
  7. scau 8639 折半插入排序
  8. 知乎cookies的介绍_知乎更新隐私政策:不点同意可选“仅浏览”,相关数据一月内删除...
  9. 最短路径问题-Floyed算法
  10. 采用两阶段Faster RCNN算法,引入light head的思想