高手请一笑而过。

物理实验课别人已经做过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写了一个自动选课的脚本 | 学步园相关推荐

  1. python 取字符串的最后一位_python中获得一个字符串最后出现位置 | 学步园

    def lastpos(findstr,mystr): #gp.AddMessage("查询=======:"+findstr+","+mystr) num=l ...

  2. 用python写一个自动群发微信脚本

    使用 Python 写一个自动群发微信脚本需要使用微信第三方 API 来实现.推荐使用 itchat 库,它提供了简单易用的 API,可以方便地编写微信自动化脚本. 首先,你需要安装 itchat 库 ...

  3. 为了帮学姐完成了钢琴家梦想,我用Python写了一个自动弹钢琴脚本,轻松弹奏出《天空之城》

    人生苦短,我用Python 絮叨絮叨 效果展示 功能实现 代码实现 准备演奏 絮叨絮叨 事情是这样的,学姐马上要毕业了,前两天跟我彻夜长谈,还说自己一直有个钢琴家的梦想. 这不为了帮学姐圆梦,在我经过 ...

  4. 为了帮女神完成钢琴家梦想,我用Python写了一个自动弹钢琴脚本,轻松弹奏出各种钢琴曲!

    事情是这样的,女神马上要毕业了,前两天跟我彻夜长谈,还说自己一直有个钢琴家的梦想. 这不为了帮女神圆梦,在我经过一番苦思冥想之后,终于用Python写了一个自动弹钢琴脚本,不会钢琴的都能成为钢琴家. ...

  5. 用shell写了一个自动编译代码的脚本

    点击打开链接 为了充分利用晚上的时间进行编译,用shell写了一个自动编译代码的脚本,这样保证第二天的调试工作不会受大版本编译的影响,同时也能监测服务器端的代码是否出错.我习惯是在每天下班离开之前运行 ...

  6. 初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助...

    初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助,如果有bug或者更好的优化方案,也请批评与指正,谢谢,代码如下: 1 var fs = require( ...

  7. 写了一个播放quic的脚本,其他文件单独上传

    写了一个播放quic的脚本 import com.jd.forcebot.toolkit.parameterized.latest.AsciiFileAccessArbitrarily; import ...

  8. 树莓派能直接运行python程序_在树莓派上运行python脚本 - python

    我正在研究rapiberry pi 3大约3个月,开始使用它时遇到了问题. 我找不到在树莓派打开时在其上运行python脚本的有效,安全的方法(没有监视器,鼠标和键盘).此刻,我在/ etc / pr ...

  9. 想去看演唱却总是抢不到票?教你用Python制作一个自动抢票脚本

    前言 嗨喽!大家好,这里是魔王!! 大麦网,是中国综合类现场娱乐票务营销平台,业务覆盖演唱会. 话剧.音乐剧.体育赛事等领域. 但是因为票数有限,还有黄牛们不能丢了饭碗,所以导致了,很多人都抢不到票 ...

  10. 21天精通python电子版_小白21天精通Python是如何做到的?

    第二种:看网站入门教程,很多人推荐的廖雪峰Python教程 第三种:视频教程,推荐慕课网.其他还有网易云课堂,学堂在线(这个里边大学课程比较多) 学写一些基本的Python程序,上述<简明 Py ...

最新文章

  1. Gradle dependency cache may be corrupt
  2. 如何使用VB编写Excel的COM组件
  3. 聊聊scalecube-cluster的GossipProtocol
  4. Redis 过期键删除策略
  5. 工业互联网企业如何做,才能“赋能万物,连接未来”?
  6. Windows计算机功能Java源码
  7. 斑能不能彻底去掉_用茶树精油祛痘时,千万不能做这5件事!!!
  8. flume数据采集_大数据采集系统Flume集群部署
  9. 我的小导师-天津大学张梅山老师要招NLP方向的研究生啦!
  10. cocos2D icon
  11. 深入浅出:Java多线程编程实战(一)
  12. ASP.NET MVC——XX点餐管理系统后台项目实训总结书
  13. 差分 线宽 线距_做设计时线宽、线距规则设置多大比较好?
  14. 你的选择,决定了你过怎样的生活
  15. User requirement
  16. 教资科目二重点简答题总结
  17. 用正割对数计算积分的方法
  18. fidic的新绿皮书_FIDIC新绿皮书也叫简明合同格式
  19. 辉芒微IO单片机FT60F211-RB
  20. 制作抖音卡点视频?Python来帮你~

热门文章

  1. python输入一个三位数输出百位十位个位_“任意输入一个三位数,输出这个三位数的百位、十位和个位,并且计算十位百位个位的和。”c语言程序...
  2. 硬件电路设计之与非门触发器74HC30和74HCT20
  3. 【Android】安卓开发中的MVP架构模式与应用实例
  4. verilog赋多位值_verilog语句两个always块对同一个变量赋值问题!【恢复】
  5. 5二十五项反措——防止机网协调事故
  6. 量子力学中常用的微积分知识归纳
  7. 数学建模——论文排版
  8. CentOS7.6Arm Qt开发环境(GCC+Qt5+QtCreator+JDK8+MySQL8+CMake+ProtoBuf+Python+SVN)
  9. 如何用word制作英语答题卡_英语考试答题卡(word 版)
  10. 渗透测试-地基篇-拖库七种方法(十一)