Python selenium自动化识别验证码模拟登录操作(二)
来源:互联网 发布:拍拍贷淘宝买满标流程 编辑:程序博客网 时间:2024/06/05 07:04
上次总结 Python selenium自动化模拟登录操作(一) 没有处理验证码的情况。现在实现了,还是以百度登录页面为例。
首先故意输入错误的账号登陆,很快就会出现需要验证码了。
这里可以看到图片所在的标签 和id,同时还有一个验证码地址,如下。该地址每次随机生成一张图片。
https://passport.baidu.com/cgi-bin/genimage?njGcb06e212fe8de27902311482de0178143145de06c70113b0
因为每次运行查看url时,图片又变化了,所以无法获取到验证码的图片与当前登录界面相对应起来。因此只能截图,并用其他工具识别出图片的字符。
再看看,在默认情况下,即不需要验证码登录的情况下,其实也是有一张图片的,只是非常小,只有一个小点,图片地址如下:
https://passport.baidu.com/passApi/img/small_blank.gif
因此,用两个图片地址部分作对比,可以判断当前需不需要用到验证码:
imgsrc = driver.find_element_by_id("TANGRAM__PSP_3__verifyCodeImg").get_attribute('src')if re.match(r'https://passport.baidu.com/cgi-bin/genimage.*', imgsrc):print("需要验证码")else:print("不需要验证码")
如果需要验证码,则读取图片并输入;如果不需要,则直接提交登录。
接下来最主要的就是图片的截取和读取了。webdriver 是可以进行浏览器页面截图的,但是整个浏览器页面太大,还需要定位到 验证码图片的位置才行。验证码的标签 id 为 TANGRAM__PSP_3__verifyCodeImg ,这样就可以定位到该ID标签所在的页面像素位置了。再获取标签大小,可确定标签的宽高了。
location = driver.find_element_by_id('TANGRAM__PSP_3__verifyCodeImg').locationsize = driver.find_element_by_id('TANGRAM__PSP_3__verifyCodeImg').sizeleft = location['x']top = location['y']right = location['x'] + size['width']bottom = location['y'] + size['height']
最终保存的验证码图片如下,位置稍微偏了,可以调整左右像素。
接下来通过处理后,进行验证码的读取。读取使用 pytesseract ,安装该模块之后,还需要安装 tesseract-ocr 。
tesseract-ocr 下载地址: https://digi.bib.uni-mannheim.de/tesseract/
本次测试下载的是 tesseract-ocr-setup-4.00.00dev.exe ,这块的过程遇到好几个问题。
FileNotFoundError: [WinError 2] 系统找不到指定的文件。
pytesseract.pytesseract.TesseractError: (2, 'Usage: python pytesseract.py [-l lang] input_file')
pytesseract.pytesseract.TesseractError: (1, 'Error opening data file \\Program Files (x86)\\Tesseract-OCR\\eng.traineddata')
这几个问题主要是需要安装配置Tesseract-OCR,
1. 下载安装tesseract-ocr,
2. 添加环境变量: TESSDATA_PREFIX = C:\Program Files (x86)\Tesseract-OCR
3. 编辑文件 D:\Python35\Lib\site-packages\pytesseract\pytesseract.py
tesseract_cmd = 'tesseract'
改为:
tesseract_cmd = 'C:/Program Files (x86)/Tesseract-OCR/tesseract'
脚本如下:
#-*- coding: utf-8 -*-# python 3.5.0import reimport requestsimport pytesseractfrom selenium import webdriverfrom PIL import Image,ImageEnhanceusername = "xxxxxx"password = "xxxxxx"chromedriver = 'D:/Python35/selenium/webdriver/chromedriver/chromedriver.exe'loginurl = 'https://passport.baidu.com/v2/?login'#截图或验证码图片保存地址screenImg = "D:/Python35/selenium/webdriver/chromedriver/screenImg.png"#打开浏览器driver = webdriver.Chrome(executable_path=chromedriver)driver.get(loginurl)driver.implicitly_wait(1)#cookie= driver.get_cookies()assert "登录百度帐号" in driver.title#数据账号&密码(此处不提交)driver.find_element_by_id("TANGRAM__PSP_3__userName").send_keys(username)driver.find_element_by_id("TANGRAM__PSP_3__password").send_keys(password)#用于测试,此处可提前提交,让登录出错,页面出现验证码#driver.find_element_by_id("TANGRAM__PSP_3__submit").click()#获取验证码URL地址imgsrc = driver.find_element_by_id("TANGRAM__PSP_3__verifyCodeImg").get_attribute('src')#如果匹配验证码路径成功(说明有提示输入验证码),则需读取验证码!if re.match(r'https://passport.baidu.com/cgi-bin/genimage.*', imgsrc):#浏览器页面截屏driver.get_screenshot_as_file(screenImg)#定位验证码位置及大小location = driver.find_element_by_id('TANGRAM__PSP_3__verifyCodeImg').locationsize = driver.find_element_by_id('TANGRAM__PSP_3__verifyCodeImg').sizeleft = location['x']top = location['y']right = location['x'] + size['width']bottom = location['y'] + size['height']#从文件读取截图,截取验证码位置再次保存img = Image.open(screenImg).crop((left,top,right,bottom))img = img.convert('L') #转换模式:L | RGBimg = ImageEnhance.Contrast(img)#增强对比度img = img.enhance(2.0) #增加饱和度img.save(screenImg)#再次读取识别验证码img = Image.open(screenImg)code = pytesseract.image_to_string(img)#code= pytesser.image_file_to_string(screenImg)driver.find_element_by_id("TANGRAM__PSP_3__verifyCode").send_keys(code.strip())print(code.strip())#提交登录driver.find_element_by_id("TANGRAM__PSP_3__submit").click()#driver.implicitly_wait(10)#driver.quit()
虽然可以识别验证码了,但是这工具识别很不准确,除非没有什么干扰的验证图片才好些。只能识别还是不那么好啊。
- Python selenium自动化识别验证码模拟登录操作(二)
- Python selenium自动化模拟登录操作(一)
- python+selenium识别验证码并登录
- python+selenium识别验证码并登录
- 【Python模拟登录与验证码识别】
- python---POST/GET请求数据包,图片验证码自动化识别,pytesseract,模拟用户一次正常登录
- Selenium+Python 自动化操控登录界面(有简单验证码图片校验)
- 【Python模拟登录】py2模拟登陆CSDN(人工识别验证码)
- Python selenium 后台运行模拟登录操作(三)
- selenium+python自动化测试(二)--使用webdriver操作浏览器
- 基于Python的Selenium自动化— 实现验证码截取并识别
- python+Selenium模拟登录
- 自动化测试(python+selenium)入门(二)
- Selenium自动化测试:如何使用cookie跳过验证码登录
- Java selenium无界面爬取需要登录的页面+验证码截取+验证码识别python tensorflow
- python---post请求数据包,正常模拟登录,图片验证码未自动化,phtesseract
- selenium使用ocr识别实现网页动态验证码登录
- java selenium tess4j识别验证码模拟登陆。
- bzoj 2733 [HNOI2012]永无乡
- Java字符串转数字(不使用jdk工具方法)
- PE文件学习笔记(五):导入表、IAT、绑定导入表解析
- cpp引用的运用场景
- springmvc静态资源解析异常的问题
- Python selenium自动化识别验证码模拟登录操作(二)
- Promise在工作中常用的几种示例
- 使用ES6语法进行Base64的编码和解码
- Qt中路径问题小结
- 计蒜客-子树结点个数
- Javascript学习笔记(String对象)
- stm32_013_STM32printf()函数重定向到串口
- Spring Cloud(五)断路器监控(Hystrix Dashboard)
- IBM-UK ftp资料站