Python+Selenium+PIL+Tesseract真正自动识别验证码进行一键登录
Python 2.7 IDE Pycharm 5.0.3 Firefox浏览器:47.0.1
PIL : Pillow-3.3.0-cp27-cp27m-win_amd64.whl
PIL第三方库的下载 win下安装whl文件
http://www.cnblogs.com/2589-spark/p/4501816.html
Pytesser:依赖于PIL ,Tesseract 了解pytesser及基本使用
http://blog.sina.com.cn/s/blog_5d56279201017fta.html
Tesseract:3.0.2 tesseract下载及安装
http://blog.csdn.net/wanghui2008123/article/details/37694307
我有个理想,就是把TMD教务系统弄崩溃,我港真的!
扯淡
我相信每个脚本都有自己的故事,我这个脚本来源于自己GRD教务系统,每次进行登录时,即使我输入全部正确,第一次登录一定是登不上去的!我不知道设计人员什么想法?难道是为了反爬机制?你以为一次登不上,我tm就不爬了?我要是不高兴了,信不信秒秒钟访问你1000+让大家都上不去咯~咳咳,有点跑题了。
目的
自动识别验证码模拟登陆,注意是自动,一键登录,不是那种扫出验证码,然后手动输入登录!
第一次放动图,心理还有点小激动~
遇到问题及解决方法
1:验证码取得问题,因为每次刷新之后验证码动态刷新,所以如果不采用cookie的话(我还不太会用cookie),根本捉不到元素,这个我在下篇文章中采用cookie来登录的,但不是调用浏览器,这个跑远了,下次说。
1:解决方案:用了driver.get_screenshot_as_file
方法,机智的进行全截图,然后采用PIL中的crop进行再截图操作,可能有人会说,为什么不采用ImageGrab.grab()
函数来做,好吧,因为这个函数在win10上尽然!截不了全图!!自己试了才知道,btw,我的分辨率1920x1080,难道和分辨率有关?反正这个我截了好久都没有成功,到最后才想到,截全部看看,结果,tmd只有一半,我说怎么都找不到要截图的部分!
2:验证码验证错误率高问题
2:解决方案,采用PIL强大的图像处理功能,我先将图片二值化,本来是蓝色字体的,,然后再进行对比度强化来锐化图片,然后再调用Tesseract.exe进行处理,提高的识别精度不是一点两点:看图比较,左1是用cookie抓的原图,右边是全景截图,再定位截图,再进行二值化和锐化处理的图,本来我想着用matlab做图像识别的,但是想想还要调用,感觉有点麻烦。。。
3:调用Tesseract.exe问题 3:解决方案因为程序执行图像识别需要调用Tesseract.exe,所以必须把路径切到有这个exe的路径下,刚开始,以为和包依赖,结果根本没有识别出任何图!折腾一个多小时才写好验证码识别的问题—-单独测试的确很重要,记一笔!
4:登录失败问题–mdzz学校教务系统二次验证
4:解决方案,写了一个while循环,把主程序很大部分都扔进去了,目的也很明确,如果第一次登录失败,再重复进行登录,注意采用try试探元素是否仍然存在,except来抛出break结束循环,因为登录成功后,比如说driver.find_element_by_name('id')
是不存在的!所以当这个元素在登陆后的界面找不到时,那就说明登录成功,ok,跳出循环,进行下一步操作。
5:明明图片已截取,为什么没有识别 5:解决方案,这个我真的没想到,我一直以为可能因为save时候还没下载好,导致库中没有这张图,那就不能识别,但是我用time.sleep函数让它停下来缓缓,还是不行,我就很无语了,想了半天,可能是因为图片被占用!因为我有一个img.show()函数,为了检测有没有截取到标准的图,然后show之后这个图像就被占用了!就像你在编辑word时候,是无法删除word文档一样!果然在注释掉show之后,一切可行,真是差错查了小半天啊!!
6:元素一切就位,为什么不执行操作 6:解决方案,这个有点脑残了,不过的确是我遇到的,还是记上一笔,然后骂自己一遍sb,没有click()你让它怎么处理!!!就像用cookie登录时候还有个ENTRY呢!
7:两次验证失败后,用户名重复累加 7:解决方案,直接加了个变量,计数循环次数,观察到只要超过两次没有登录上,就会累加登录名和用户密码,直接写了个if进行判断,完事!
8:im.crop(box)裁剪区域选择困难症 8:解决方案,多试几次,反正我是试出来的。。。。当然,你点击图片进行审查元素时候,可以看到图片大小,那么,你就可以知道横纵坐标差值多少,但是大范围区域还得自己试,如有更好的办法,请告知,以下为我截图实验次数,次数30+
9:导入不了Image,ImageEnhance
9:解决方案,因为PIL用的是第三方库,所以,采用的导入方式是这样的,多看看官方文档就可以,官方描述如下
Use
from PIL import Imageinstead of
import Image.
10:找不到应该键入的元素
10:这个问题,请单击要输入的空白处右键,审查元素,就可以看到,然后根据driver.find_element_by_
各种方法来定位元素,如果输入进行了隐藏,在当前页面找不到怎么办,就像如下图,需要先点击我的图书馆,才能看到输入的账户和密码,那么先找我的图书馆的元素,进行click操作,之后再找元素,一句话,把自己想成浏览器,阿不,把python想成浏览器。。。。。
上图的代码我也放上,大同小异,比有验证码的简单,但是多了一个click操作。
断断续续差不多两天时间来实现这个操作,虽然对大家来说应该不算难,但是对自己还是有蛮大提升的,对selenium有了基本的概念和操作,对PIL也进行了使用,还有ocr的调用,虽然调用firefox来执行操作表面上看起来很酷炫,但是执行效率和占用内存是很大的内伤,但作为可视化的模拟浏览器登录,这点做的还是十分绚丽的。
- 几款更换WordPress 后台UI 的插件推荐
- 入门:构建简单的Web API
- WordPress 编辑器快捷键——让写作来得更方便些吧!
- ASP.NET Web API: 宿主(Hosting)
- 在 Windows Phone上使用QQConnect OAuth2
- WordPress 开发之使用WordPress 3.8+后台图标(dashicons)
- 基础(二)
- Ionic:高级的 HTML5 移动APP(Web App)开发框架
- 为WordPress 评论框添加HTML5 表单验证
- Sass 基础(一)
- 送上段模拟圣诞节下雪的javascript 代码
- 互联网:解开大脑之迷
- NEC 框架规范 template media
- NEC 框架规范 animation
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【数字图像处理】旋转图像的几种方法
- C#协变和逆变
- C# base64 和图片互转
- js实现图片资源转化成base64的各种场景
- js input file 转base64
- 算法和数据结构:快速排序
- 算法和数据结构:归并排序
- 算法和数据结构: 二 基本排序算法
- 非中间人就没法劫持TCP了吗?
- HW在即——红队活动之Lnk样本载荷篇
- 用正则表达式修改html字符串的所有div的style样式
- 深入理解 WebSecurityConfigurerAdapter【源码篇】
- 算法和数据结构: 十二 无向图相关算法基础
- 算法和数据结构: 十一 哈希表
- 【DB笔试面试849】在Oracle中,在没有配置ORACLE_HOME环境变量的情况下,如何获取ORACLE_HOME目录?