⼤学抢课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 = ad()
print the_page
看到有⼏个⼈问,就把代码贴出来吧,有注释:
#coding=gb2312
import urllib
import urllib2
import re
#要提交数据的⽹站
url = '……'
#选课⼈的信息
python转java代码
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 = ad()
#下⾯这个路径可以更改,我⽤的是我的路径
#这三句是将返回的⽹页写到⽂件中,以⽅便以后检索
my_file = open('/home/superior/' , 'w+') ;
my_file.write(the_page) ;
my_file.close()
#将刚才的⽹页读到内存中
my_file = open('/home/superior/' , 'r') ;
buffer = ad()
my_file.close()
#下⾯⽤了正则表达式模块中的search()⽅法
m = re.search('课程预约成功', buffer)
#如果到“课程预约成功”字符串了
if m is not None:
result_file = open('/home/superior/Documents/' , 'a+')
#将名字记录到中
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 = '……'
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 = ad()
m = re.search( '课程预约成功', the_page )
if m is not None:
result_file = open( '/home/superior/Documents/' , '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()

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。