大学抢课python脚本_用彪悍的Python写了一个自动选课的脚本 | 学步园
高手请一笑而过。
物理实验课别人已经做过3、4个了,自己一个还没做呢。不是咱不想做,而是咱不想起那么早,并且仅有的一次起得早,但是哈工大的服务器竟然超负荷,不停刷新还是不行,不禁感慨这才是真正的“万马争过独木桥“啊!服务器不给力啊……
好了,废话少说。其实,我的想法很简单。写一个三重循环,不停地提交,直到所有的数据都accepted。其中最关键的是提交最后一个页面,因为提交用户名和密码后不需要再访问其他的页面,因此不需要用到cookis。
这个只是Python最简单的应用。核心代码只有两行:
data = urllib.urlencode(each_people)
req = urllib2.Request(url , data)
这里用到了Python中Web编程中的比较重要的模块urllib和urllib2。其实你也可以用httplib来代替,两者本质上是一样的,因为urllib内部的一部分就是用httplib来实现的。
现解释一下上面的意思:each_people是一个字典,就相当于C++中的multimap、java中的hashMap,其含义是一个人的选课信息。urllib.urlencode()函数将each_people的格式转换一下,以便将其作为CGI请求的URL字符串的一部分。关于CGI是什么大家可以google一下。举个例子:
>>>import urllib
>>>each_people = {'name' : 'Tom' , 'password' : '12345' , 'class' : 'lab5'}
>>>data = urllib.urlencode(each_people)
>>>print data
结果是:name=Tom&password=12345&class=lab5
第二行看字面意思就知道其实什么意思了。参数url表示你要提交数据的网站。
那么怎么查看其返回结果呢?很简单:
response = urllib2.urlopen(req)
the_page = response.read()
print the_page
看到有几个人问,就把代码贴出来吧,有注释:
#coding=gb2312
import urllib
import urllib2
import re
#要提交数据的网站
url = 'http://……'
#选课人的信息
info_list = [
{'week' : '9', 'expnumber' : '实验10' , 'weekday' : '2' , 'exp_class' : '3-4' , 'number' : '10000000' , 'password' : '12345678' } ,
{'week' : '9', 'expnumber' : '实验10' , 'weekday' : '2' , 'exp_class' : '3-4' , 'number' : '20000000' , 'password' : 'abcdefgh' }
]
#对应的选课人的名字,可以不要,我加上这个的原因是做一个log,记住选课结果
name_list = [ '张三' , '李四']
#记录对应的是否已经选上,可以用一个 二进制数代替
trace = [ 0 , 0]
#主程序,选课
def submit():
while True:
whether_over = 1
for i , each_people in enumerate(info_list):
if trace[i] == 0 :
whether_over = 0
for j in range(20):
data = urllib.urlencode(each_people)
req = urllib2.Request(url , data)
try:
response = urllib2.urlopen(req)
except urllib2.URLError , e:
continue
else :
the_page = response.read()
#下面这个路径可以更改,我用的是我的路径
#这三句是将返回的网页写到文件中,以方便以后检索
my_file = open('/home/superior/Documents/WLlog.txt' , 'w+') ;
my_file.write(the_page) ;
my_file.close()
#将刚才的网页读到内存中
my_file = open('/home/superior/Documents/WLlog.txt' , 'r') ;
buffer = my_file.read()
my_file.close()
#下面用了正则表达式模块中的search()方法
m = re.search('课程预约成功', buffer)
#如果找到“课程预约成功”字符串了
if m is not None:
result_file = open('/home/superior/Documents/result_log.txt' , 'a+')
#将名字记录到result_log.txt中
result_file.write(name_list[i] + ' successful/n')
result_file.close()
#将此人从列表中划去
trace[i] = 1
break
#所有人都选上了
if whether_over == 1:
break
#定义主函数
def main():
submit()
#调用主函数
main()
我认为这个程序效率虽然还不错,但是我认为还可以再提升一下。主要是打开文件,读写文件,关闭文件这几个步骤耗时。但是goole摆弄了好久,没找到更好地办法。有谁找到更好地办法,请吱一声。
另外需要说明的是:
1.为了不失广泛性,info_list这个列表中的信息,是我举例用的。具体使用的话,只需将info_list和url修改一下
2.运行此程序需要预先装上Python,如何安装google一下就知道了
*************************************************************************************************************
今天(Oct 17)帮助15位同学选上了课,心里很高兴,娘的,“胜造七级浮屠”啊!
看了看log,每秒选上5个同学,感觉效率很低啊!于是又想了一下改进的办法。
第一点:
正如前面分析的那样,主要是打开、读取、关闭文件费时。我看了一下the_page和buffer的类型:相同!
print 'buffer' , type( buffer )
print 'the_page' , type( the_page )
结果:
buffer
the_page
因此,果断的把my_file这个中间文件给去掉。
第二点:
为每个人循环20遍,这个做法不明智。因为如果当前正在提交的人的信息根本不可能被accepted,比如学号密码打错了,或者选的课程已经满了(这是极有可能发生的),这时再为此人循环20遍,明显的是在浪费时间,而且影响了后面人的提交。难道这就是传说中的“占着茅坑不拉屎”?因此果断的把最后一个循环去掉。
经过上面的两点改进,相信效率一定会有极大的提升。
做了一个final版本,暂且贴上吧。
#coding=gb2312
import urllib
import urllib2
import re
import os
url = 'http://……'
info_list = [
{'week' : '9', 'expnumber' : '实验10' , 'weekday' : '2' , 'exp_class' : '3-4' , 'number' : '10000000' , 'password' : '12345678' } ,
{'week' : '9', 'expnumber' : '实验10' , 'weekday' : '2' , 'exp_class' : '3-4' , 'number' : '20000000' , 'password' : 'abcdefgh' }
]
name_list = [ '张三' , '李四' ]
trace = [ 0 , 0 ]
def submit():
while True:
whether_over = 1
for i , each_people in enumerate( info_list ):
if trace[ i ] == 0 :
whether_over = 0
data = urllib.urlencode( each_people )
req = urllib2.Request( url , data )
try:
response = urllib2.urlopen( req )
except urllib2.URLError:
continue
else :
the_page = response.read()
m = re.search( '课程预约成功', the_page )
if m is not None:
result_file = open( '/home/superior/Documents/result_log.txt' , 'a+' )
result_file.write( name_list[ i ] + ' successful ' + os.popen( 'date' ).read() + '/n' )
result_file.close()
trace[ i ] = 1
if whether_over == 1:
break
if __name__ == '__main__':
submit()
大学抢课python脚本_用彪悍的Python写了一个自动选课的脚本 | 学步园相关推荐
- python 取字符串的最后一位_python中获得一个字符串最后出现位置 | 学步园
def lastpos(findstr,mystr): #gp.AddMessage("查询=======:"+findstr+","+mystr) num=l ...
- 用python写一个自动群发微信脚本
使用 Python 写一个自动群发微信脚本需要使用微信第三方 API 来实现.推荐使用 itchat 库,它提供了简单易用的 API,可以方便地编写微信自动化脚本. 首先,你需要安装 itchat 库 ...
- 为了帮学姐完成了钢琴家梦想,我用Python写了一个自动弹钢琴脚本,轻松弹奏出《天空之城》
人生苦短,我用Python 絮叨絮叨 效果展示 功能实现 代码实现 准备演奏 絮叨絮叨 事情是这样的,学姐马上要毕业了,前两天跟我彻夜长谈,还说自己一直有个钢琴家的梦想. 这不为了帮学姐圆梦,在我经过 ...
- 为了帮女神完成钢琴家梦想,我用Python写了一个自动弹钢琴脚本,轻松弹奏出各种钢琴曲!
事情是这样的,女神马上要毕业了,前两天跟我彻夜长谈,还说自己一直有个钢琴家的梦想. 这不为了帮女神圆梦,在我经过一番苦思冥想之后,终于用Python写了一个自动弹钢琴脚本,不会钢琴的都能成为钢琴家. ...
- 用shell写了一个自动编译代码的脚本
点击打开链接 为了充分利用晚上的时间进行编译,用shell写了一个自动编译代码的脚本,这样保证第二天的调试工作不会受大版本编译的影响,同时也能监测服务器端的代码是否出错.我习惯是在每天下班离开之前运行 ...
- 初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助...
初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助,如果有bug或者更好的优化方案,也请批评与指正,谢谢,代码如下: 1 var fs = require( ...
- 写了一个播放quic的脚本,其他文件单独上传
写了一个播放quic的脚本 import com.jd.forcebot.toolkit.parameterized.latest.AsciiFileAccessArbitrarily; import ...
- 树莓派能直接运行python程序_在树莓派上运行python脚本 - python
我正在研究rapiberry pi 3大约3个月,开始使用它时遇到了问题. 我找不到在树莓派打开时在其上运行python脚本的有效,安全的方法(没有监视器,鼠标和键盘).此刻,我在/ etc / pr ...
- 想去看演唱却总是抢不到票?教你用Python制作一个自动抢票脚本
前言 嗨喽!大家好,这里是魔王!! 大麦网,是中国综合类现场娱乐票务营销平台,业务覆盖演唱会. 话剧.音乐剧.体育赛事等领域. 但是因为票数有限,还有黄牛们不能丢了饭碗,所以导致了,很多人都抢不到票 ...
- 21天精通python电子版_小白21天精通Python是如何做到的?
第二种:看网站入门教程,很多人推荐的廖雪峰Python教程 第三种:视频教程,推荐慕课网.其他还有网易云课堂,学堂在线(这个里边大学课程比较多) 学写一些基本的Python程序,上述<简明 Py ...
最新文章
- Gradle dependency cache may be corrupt
- 如何使用VB编写Excel的COM组件
- 聊聊scalecube-cluster的GossipProtocol
- Redis 过期键删除策略
- 工业互联网企业如何做,才能“赋能万物,连接未来”?
- Windows计算机功能Java源码
- 斑能不能彻底去掉_用茶树精油祛痘时,千万不能做这5件事!!!
- flume数据采集_大数据采集系统Flume集群部署
- 我的小导师-天津大学张梅山老师要招NLP方向的研究生啦!
- cocos2D icon
- 深入浅出:Java多线程编程实战(一)
- ASP.NET MVC——XX点餐管理系统后台项目实训总结书
- 差分 线宽 线距_做设计时线宽、线距规则设置多大比较好?
- 你的选择,决定了你过怎样的生活
- User requirement
- 教资科目二重点简答题总结
- 用正割对数计算积分的方法
- fidic的新绿皮书_FIDIC新绿皮书也叫简明合同格式
- 辉芒微IO单片机FT60F211-RB
- 制作抖音卡点视频?Python来帮你~
热门文章
- python输入一个三位数输出百位十位个位_“任意输入一个三位数,输出这个三位数的百位、十位和个位,并且计算十位百位个位的和。”c语言程序...
- 硬件电路设计之与非门触发器74HC30和74HCT20
- 【Android】安卓开发中的MVP架构模式与应用实例
- verilog赋多位值_verilog语句两个always块对同一个变量赋值问题!【恢复】
- 5二十五项反措——防止机网协调事故
- 量子力学中常用的微积分知识归纳
- 数学建模——论文排版
- CentOS7.6Arm Qt开发环境(GCC+Qt5+QtCreator+JDK8+MySQL8+CMake+ProtoBuf+Python+SVN)
- 如何用word制作英语答题卡_英语考试答题卡(word 版)
- 渗透测试-地基篇-拖库七种方法(十一)