【已解决】我的post抢票程序,循环速度很慢是怎么回事?(无验证码)
本帖最后由 gyhhi 于 2015-12-17 17:57 编辑内部的一个小网站,我做了个很简单的抢票程序,每天8点整网站开始放票,若还没到8点就抢票,网页会返回“尚未开始”的提示,下面的POST程序保证没问题,返回值正常,可以读到“尚未开始”,与httpwatch截获的内容一致。
为保证能抢到,我是7点59分就开始不停地post数据,for循环速度只有可怜的3~4次每秒,也就是相当于250毫秒才能提交一次,这速度有时候还不如手工···{:1_521:}
关键程序在下面,不过只能在我们的内网使用,大家应该是运行不了。就是想让大伙看看,为什么循环的速度这么慢?????
(抢票时不需要验证码);前面是用POST登陆网站,内容略去,大家只看下面
MsgBox(0,"ok","登陆成功")
;登陆成功,下面开始抢票
$PostPage='http://XXXXXXXXX已隐藏xxxx';抢票的post URL
$PostData='Command=GetTickets&Code=2&DateType=Today&TimeType=ALL&DeptID=1' ;post内容是明文,而且是固定的
For $ii=1 To 100000
$xmlhttp.open("POST", $PostPage, True);异步模式->不用等待网站的回应。用同步模式会更慢
$xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');头信息
$xmlhttp.send($PostData);抢票
;~ $bodytext = BinaryToString($xmlhttp.responseBody, 4);
;~ ConsoleWrite($bodytext&@CR)
ToolTip($ii);显示循环次数,用来观察抢票的速度
Next 快来人那,大家帮我看看{:face (297):} 还没有人啊,a大大在哪里 要是后台不限制同一IP或用户名的连接数的话,你用多线程去抢比较合适。
另外这些抢票不用提前太多时间POST,提前一两秒就可以了。
至于你程序慢的原因,一般应该是网络阻塞和后台服务器响应慢,换成winhttp试试。 回复 4# tank
应该不是这个你说的这个原因,不知道不写cookie是不是会导致变慢?或者说我的程序的连接不能保持keep-active?每次post都得在他们服务器那里验证?
另外,确定不是网络阻塞,也不是服务器慢,因为没有验证码,我用_IEImgClick模拟点击,并检测返回值是否成功,发现速度能达到50+次/s。 回复 1# gyhhi
可以在你07至14行代码间 增加时间输出;看下 是那一步满了;
应该和你每次post都创建连接有关 可以把连接 放在循环体外面,循环体内增加连接状态检测,发现超时或断开再重新连接 想问下LZ,你不用创建对象? $xmlhttp=ObjCreate("MSXML2.XMLHTTP") ?
个人看法,照7L说的去试试,看你语句,就只有连接会相对耗时,其他的都不会有很大的时间延迟。 回复 7# wql8549
如果放到外面,第10行的$xmlhttp.send($PostData)语句会出错,你的没问题吗? 回复 8# user030
上面只贴出了关键语句,创建对象在前面,没贴上来。。
把连接语句放到循环外面,第10行的send语句会出错,不知道什么原因,你知道吗?是因为连接断开了吗?如果是的话,如何保持连接状态呢?需要自己写cookie还是? 使用ObjCreate("winhttp.winhttprequest.5.1")试试
还有$xmlhttp.open("POST", $PostPage, True) ture的时候是同步,false才是异步
cookie程序自己会处理 回复 11# gto250
你弄错了吧,那个标志位名字叫“是否异步”,所以,true=异步,false=同步。
另外winhttp.winhttprequest.5.1对象不也是基于微软那个对象,然偶自己封装的吗,winhttp的头文件里应该能查到 速度慢确实是因为网站响应慢导致的,不是程序问题。
不限制同一IP连接数,最后用多进程UDF实现了提速。结贴
页:
[1]