早前的时间,使用python编写了一个自动挂课程的程序,开发出来后,使用起来没遇到问题,大部分课程都能自动处理。但自从课程平台开始加入防挂机机制,不定时弹出验证码。因此先前编写的程序运行起来的效果就有点差了,总是被退出登录,课程总是完不成。愁啊,后来即使加入了异常捕捉处理,重启程序,但效果还是不理想的效果。由于之前比较忙,而且也没需要学习的课程,所以就把这个自动挂课程程序扔在了一边。最近开始又兴起了班后学习,该解决的问题还是需要解决。于是想到了两个解决方案:
一、使用程序一直监听网页,判断验证码的弹出,然后输入验证码,继续学习
这个方案,内存占用高,程序需要一直在捕捉页面,判断页面是否弹出验证码,加上对于弹出的验证码,需要使用图形识别技术,识别还需要高效和准确,对于图形识别平台,网上找了下资料,发现好多博主都推荐tesserocr这个模块,我下载并测试了一下,效果不太理想,识别准确率不是很高。在网上再找了一圈验证码接口平台,效果是真心不错,但顶不住需要收费呀,所以也就没往这方面入手了,至此,这个方案暂时不适合。
二、使用页面监测,页面关闭后马上重启
出现验证码后如果没有及时输入,系统会把课程的标签页关闭,于是我想着使用多一个线程,监测课程网页的标签页是否存在,不存在就重启。但是发现线程监测不太理想,于是把这个监测的方向也放入了程序的线程中。经过使用,虽然笨拙,但是效果理想,已解决了验证码困扰的问题。
具体代码如下:
def monitorHandle(self):
driver=self.driver
allHandles = driver.window_handles # 所有的handles
if self.curLenHandle in allHandles:
print('存在标签页中')
else:
print('没在标签页中,抛出异常重启')
raise Exception('自定义没在标签页的异常') #自定义抛出的类型