Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录
发布时间 - 2026-01-11 03:20:12 点击率:次本文介绍了Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录,分享给大家,具体如下:

- Python 2.7
- IDE Pycharm 5.0.3
- Firefox浏览器:47.0.1
- Selenium
- PIL
- Pytesser
- Tesseract
扯淡
我相信每个脚本都有自己的故事,我这个脚本来源于自己GRD教务系统,每次进行登录时,即使我输入全部正确,第一次登录一定是登不上去的!我不知道设计人员什么想法?难道是为了反爬机制?你以为一次登不上,我tm就不爬了?我要是不高兴了,信不信秒秒钟访问你1000+让大家都上不去咯~咳咳,有点跑题了。
Talk is cheap, Show me the code
自动识别验证码模拟登陆,注意是自动,一键登录,不是那种扫出验证码,然后手动输入登录!首先来代码实现吧!
# -*- coding: utf-8 -*-
#Author:哈士奇说喵
from selenium import webdriver
import os
import pytesser
import sys,time
from PIL import Image,ImageEnhance
#shift+tab多行缩进(左)
reload(sys)
PostUrl = "http://yjsymis.hrbeu.edu.cn/gsmis/indexAction.do"
driver=webdriver.Firefox()
driver.get(PostUrl)
i=0
while 1:#sb登录系统,即使输对所有消息还是登不进去的,需要登录两次及以上
i=i+1
try:
elem_user = driver.find_element_by_name('id')
elem_psw = driver.find_element_by_name('password')
elem_code = driver.find_element_by_name('checkcode')
except:
break
#-------------------对验证码进行区域截图,好吧,这方法有点low------------------
driver.get_screenshot_as_file('C:\Users\MrLevo\image1.jpg')#比较好理解
im =Image.open('C:\Users\MrLevo\image1.jpg')
box = (516,417,564,437) #设置要裁剪的区域
region = im.crop(box) #此时,region是一个新的图像对象。
#region.show()#显示的话就会被占用,所以要注释掉
region.save("e:/image_code.jpg")
#-------------------------------------------------------------------
#--------------ImageGrab.grab()直接可以区域截图,但是有bug,截图不全-------
'''
bbox = (780, 0, 1020, 800)
img = ImageGrab.grab()
img.save("E:\image_code.jpg")
img.show()
'''
#-------------------------手动输入验证码:适用范围更广,但不够方便------------------------------
'''
response = opener.open(CaptchaUrl)
picture = response.read()
with open('e:/image.jpg', 'wb') as local:
local.write(picture)
# 保存验证码到本地
#------------对于不能用pytesser+ocr进行识别,手动打开图片手动输入--------
# 打开保存的验证码图片 输入
#SecretCode = raw_input('please enter the code: ')
#----------------------------------------------------------------------
'''
#--------------------图片增强+自动识别简单验证码-----------------------------
#time.sleep(3)防止由于网速,可能图片还没保存好,就开始识别
def image_file_to_string(file):
cwd = os.getcwd()
try :
os.chdir("C:\Users\MrLevo\Anaconda2\Lib")
return pytesser.image_file_to_string(file)
finally:
os.chdir(cwd)
im=Image.open("E:\\image_code.jpg")
imgry = im.convert('L')#图像加强,二值化
sharpness =ImageEnhance.Contrast(imgry)#对比度增强
sharp_img = sharpness.enhance(2.0)
sharp_img.save("E:\\image_code.jpg")
#http://www.cnblogs.com/txw1958/archive/2012/02/21/2361330.html
#imgry.show()#这是分布测试时候用的,整个程序使用需要注释掉
#imgry.save("E:\\image_code.jpg")
code= pytesser.image_file_to_string("E:\\image_code.jpg")#code即为识别出的图片数字str类型
print code
#打印code观察是否识别正确
#----------------------------------------------------------------------
if i <= 2: # 根据自己登录特性,我这里是验证码失败一次,重填所有,失败两次,重填验证码
elem_user.send_keys('S315080092')
elem_psw.send_keys('xxxxxxxxxx')
elem_code.send_keys(code)
click_login = driver.find_element_by_xpath("//img[@src='main_images/images/loginbutton.gif']")
click_login.click()
#time.sleep(5)#搜索结果页面停留片刻
#driver.save_screenshot('C:\Users\MrLevo\image.jpg')
#driver.close()
#driver.quit()
Show Gif ( :
第一次放动图,心理还有点小激动~
遇到问题及解决方法
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用的是第三方库,所以,采用的导入方式是这样的,多看看官方文档就可以,官方描述如下
Usefrom PIL import Imageinstead ofimport Image.
10:找不到应该键入的元素
10:这个问题,请单击要输入的空白处右键,审查元素,就可以看到,然后根据driver.find_element_by_各种方法来定位元素,如果输入进行了隐藏,在当前页面找不到怎么办,就像如下图,需要先点击我的图书馆,才能看到输入的账户和密码,那么先找我的图书馆的元素,进行click操作,之后再找元素,一句话,把自己想成浏览器,阿不,把python想成浏览器。。。。。
上图的代码我也放上,大同小异,比有验证码的简单,但是多了一个click操作。
# -*- coding: utf-8 -*-
#Author:哈士奇说喵
from selenium import webdriver
import time
import sys
#shift+tab多行缩进(左)
reload(sys)
PostUrl = "http://lib.hrbeu.edu.cn/#"
driver=webdriver.Firefox()
driver.get(PostUrl)
elem_user = driver.find_element_by_name('number')
elem_psw = driver.find_element_by_name('passwd')
#选择我的图书馆,点击后才能看到输入账号密码
click_first = driver.find_element_by_xpath("//ul[@id='imgmenu']/li[4]")
click_first.click()
elem_user.send_keys('S315080092')
elem_psw.send_keys('xxxxxxxx')
#点击登录
click_second = driver.find_element_by_name('submit')
click_second.click()
time.sleep(5)
#登陆后选择
click_third = driver.find_element_by_xpath("//*[@id='mainbox']/div/div/ul/li/a")
click_third.click()
time.sleep(5)#搜索结果页面停留片刻
#driver.save_screenshot('C:\Users\MrLevo\image.jpg')
driver.close()
driver.quit()
最后
(虽然我知道以后肯定会再补充):断断续续差不多两天时间来实现这个操作,虽然对大家来说应该不算难,但是对自己还是有蛮大提升的,对selenium有了基本的概念和操作,对PIL也进行了使用,还有ocr的调用,虽然调用firefox来执行操作表面上看起来很酷炫,但是执行效率和占用内存是很大的内伤,但作为可视化的模拟浏览器登录,这点做的还是十分绚丽的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# python自动识别验证码
# python
# 识别验证码
# 验证码自动识别
# Python完全识别验证码自动登录实例详解
# [机器视觉]使用python自动识别验证码详解
# python利用Tesseract识别验证码的方法示例
# python使用tensorflow深度学习识别验证码
# python+selenium识别验证码并登录的示例代码
# python入门教程之识别验证码
# python识别验证码图片实例详解
# 验证码
# 两次
# 锐化
# 就像
# 自动识别
# 就会
# 还没
# 那就
# 找不到
# 用了
# 然后再
# 好吧
# 写了
# 让它
# 搜索结果
# 后才
# 一键
# 进行了
# 就可以
# 自己的
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
Laravel如何处理和验证JSON类型的数据库字段
Java垃圾回收器的方法和原理总结
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
如何在万网ECS上快速搭建专属网站?
如何在万网利用已有域名快速建站?
EditPlus 正则表达式 实战(3)
高防服务器租用指南:配置选择与快速部署攻略
Android使用GridView实现日历的简单功能
打开php文件提示内存不足_怎么调整php内存限制【解决方案】
中国移动官方网站首页入口 中国移动官网网页登录
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
Laravel如何实现API速率限制?(Rate Limiting教程)
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
如何自定义建站之星模板颜色并下载新样式?
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
网站制作报价单模板图片,小松挖机官方网站报价?
Python函数文档自动校验_规范解析【教程】
jQuery 常见小例汇总
详解MySQL数据库的安装与密码配置
Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】
QQ浏览器网页版登录入口 个人中心在线进入
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
香港服务器选型指南:免备案配置与高效建站方案解析
Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】
Laravel怎么在Blade中安全地输出原始HTML内容
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
Laravel观察者模式如何使用_Laravel Model Observer配置
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
如何确保西部建站助手FTP传输的安全性?
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
韩国服务器如何优化跨境访问实现高效连接?
再谈Python中的字符串与字符编码(推荐)
lovemo网页版地址 lovemo官网手机登录
如何快速打造个性化非模板自助建站?
Angular 表单中正确绑定输入值以确保提交与验证正常工作
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
如何在Windows环境下新建FTP站点并设置权限?
昵图网官网入口 昵图网素材平台官方入口
Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】
如何在阿里云部署织梦网站?
如何在新浪SAE免费搭建个人博客?
PHP正则匹配日期和时间(时间戳转换)的实例代码

