中山大学羽毛球场馆自动订场(Python+selenium+百度aip) 您所在的位置:网站首页 中大体育馆预约网站 中山大学羽毛球场馆自动订场(Python+selenium+百度aip)

中山大学羽毛球场馆自动订场(Python+selenium+百度aip)

2024-07-10 17:11| 来源: 网络整理| 查看: 265

双鸭山南校人太多,小伙伴们日常约球抢不到室内的场馆,只好去室外打。所以趁考完试有时间写了一个自动抢羽毛球场的脚本,网好的时候20秒订场无压力。下面来分享一波这个脚本的一些技术细节(重点讲一下图像降噪和百度云的文字识别接口),也算是对我这两天学习的一个总结。

其实在大概在一年之前在自动操作浏览器上selenium+phantomjs还是标配,但是随着17年8月firefox和chrome相继推出了无头模式的浏览器完美地取代了phantomjs,所以selenium 3.8.1以上的版本都不再支持phantomjs。这个脚本用的是headless firefox,与以往Selenium不同的是需要额外加载selenium firefox 的官方Webdriver:Geckodriver,不然会报错。另外一个要注意的是如果想用headless firefox需要电脑本身已经安装了firefox(注意至少是56.0以上的版本,否则不支持无头模式)。

Gecokdriver下载地址:https://github.com/mozilla/geckodriver/releases

首先配置好driver并获取鸭大NetID登录页面信息:

from selenium import webdriver driver = webdriver.Firefox(executable_path='.../geckodriver')#根据geckodriver所在路径配置driver driver.get("http://gym.sysu.edu.cn/product/show.html?id=61")#获取页面信息 driver.maximize_window()#最大化窗口 driver.find_element_by_xpath("//a[contains(text(),'登录')]").click()#跳转到登录页面

配置好driver后,我们就可以用python在后台操作网页啦,一些常用的操作:

driver.get("http://gym.sysu.edu.cn/index.html")#打开网页 driver.find_element_by_xpath("//a[@href='/product/index.html']").click()#用click()点击用xpath定位到的网页元素 driver.find_element_by_xpath("//input[@id='txt_name']").send_keys('英东羽毛球场')#用send_keys()向输入框中填入数据 driver.execute_script("window.scrollTo(0,500)")#滑动网页到指定位置 driver.save_screenshot(screenshotadd)#保存当前页面截图 driver.page_source()#获取当前页面源代码 driver.current_url#当前页面的url

我们需要对登录页面截图,根据验证码的xpath定位验证码在整张截图的位置并截取保存验证码到本地:

def Convertimg(): imglocation = ("//img[@name='captchaImg']")#验证码的xpath地址 driver.save_screenshot(screenshotadd) im = Image.open(screenshotadd) left = driver.find_element_by_xpath(imglocation).location['x'] top = driver.find_element_by_xpath(imglocation).location['y'] right = driver.find_element_by_xpath(imglocation).location['x'] + driver.find_element_by_xpath(imglocation).size['width'] bottom = driver.find_element_by_xpath(imglocation).location['y'] + driver.find_element_by_xpath(imglocation).size['height'] im = im.crop((left, top, right, bottom)) im.save(codeadd)

原始的验证码是这样的:

虽然现在百度谷歌阿里都有各自的将图像识别成文字的python接口,但是这些接口在图像有噪音时普遍很差。比如这里的验证码有多条直线穿过,如果直接用像pytesseract这样的图像识别接口来识别的话基本上成功率只有百分之几,也就是说可能要试100次才能成功登陆几次,那我这卡着12点抢场地的脚本肯定要凉。所以必须对验证码进行降噪再进行图像识别才行。事实上经过降噪处理的验证码识别一次成功率达到了80%以上。

现在比较流行的比较标准的验证码识别套路是(图片来自https://blog.csdn.net/eddy_zheng/article/details/48895085):

但是我发现我们学校验证码上的噪音线都是黑色的,而字符通常都是彩色的,这可是个大bug啊哈哈哈。所以我的降噪流程是:

1.将黑色以及接近黑色的噪音线(R,G,B值都接近0)替换为白色(R,G,B值都是255)

2.将第一步得到的图像进行二值处理变成黑白图像,灰度阈值设为160都可,也就是低于这个阈值的点都填白色,高于这个阈值的点都填黑色

3.提取边缘,使得字母和数字更清晰(虽然在这张图不太明显,但是经过几十张验证码的测试,这一步还是有必要的):

4.把图片适当变大一点,提高文字识别的精度

到这里降噪就完成啦,顺便介绍一下python图片处理界的三个大佬:PIL、opencv和skimage。PIL应该是最老的一位大佬,有些年久失修而且目前只支持python 2.x版本,于是有人就把它改造升级成了python 3.x下的pillow,功能也变强了(但仍然是偏基础的库)。opencv可以说是高端玩家了,不仅高端还资格老,不仅资格老还在不停地更新。图像处理对opencv只是小菜,它还能处理视频,也有深度神经网络和机器学习功能,这意味着opencv自己就可以完成对文字识别的训练和深度学习提高识别精度,可以说是图像处理界的战斗机了。skimage看名字就知道它和大名鼎鼎的scikit-learn有点儿关系,功能上比较接近opencv,也是个强大的包。我觉得看documentation应该是学习一个包最快的方式,这里放上三个包的documentation地址。但是也放上一个写得不错的图像处理的总结比较贴供参考:https://blog.csdn.net/IAMoldpan/article/details/78628460

Documentation地址:

skimage : http://scikit-image.org/docs/stable/

opencv:https://docs.opencv.org/master/d9/df8/tutorial_root.html

PIL:http://pillow.readthedocs.io/en/5.2.x/

降噪部分的代码:

def clearimage(originadd): img = Image.open(originadd)#读取系统的内照片 #将黑色干扰线替换为白色 width = img.size[0]#长度 height = img.size[1]#宽度 for i in range(0,width):#遍历所有长度的点 for j in range(0,height):#遍历所有宽度的点 data = (img.getpixel((i,j)))#打印该图片的所有点 if (data[0]


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有