selenium (八) 图片验证码识别

图片验证码识别实践
本文探讨了使用pytesseract和pytesser模块识别图片验证码的方法,包括安装必要的软件包、设置环境变量、使用Selenium和PIL库抓取验证码图片,以及处理图片提高识别率的技术。然而,实际应用中识别率较低,需进一步优化。
部署运行你感兴趣的模型镜像

 

1.需要安装Image 模块,安装时会自动帮我们安装:Installing collected packages: pytz, django, pillow, Image 关联的包
pip install Image

2.安装pytesseract
pip install pytesseract


3.安装tesseract-ocr识别引擎
Tesseract的OCR引擎最先由HP实验室于1985年开始研发,至1995年时已经成为OCR业内最准确的三款识别引擎之一。
下载地址:https://jaist.dl.sourceforge.net/project/tesseract-ocr-alt/tesseract-ocr-setup-3.02.02.exe
安装好后,需要在D:\Tools\Python27\Lib\site-packages\pytesseract\pytesseract.py下将
tesseract_cmd = 'tesseract'
改为:
tesseract_cmd="D:\\Tools\\Tesseract-OCR\\tesseract.exe"也就是Tesseract-OCR的安装路径,
或将该路径添加到环境变量中.要不然调用的时候,会报如下错误:

自己试了几次,这个pytesseract的识别率太低了。经常识别不出图片验证码的内容

第一种方法:

#-*-encoding:utf-8-*-
from selenium import webdriver
from PIL import Image,ImageGrab
from time import sleep
import pytesseract


driver=webdriver.Chrome()
driver.get("http://localhost:8081/tshop/index.php?con=simple&act=login")

def click_register_link():
	driver.find_element_by_link_text(u"立即注册").click()
	sleep(0.5)

	verifyCode=driver.find_element_by_xpath('//*[@id="captcha_img"]').rect  #获取二维码在页面的位置
	start_x=int(verifyCode["x"])
	start_y=int(verifyCode["y"])
	end_x=verifyCode["width"]+start_x   #开始坐标+结束坐标点
	end_y=verifyCode["height"]+start_y  #开始坐标+结束坐标点
	cut_img=(start_x,start_y,end_x,end_y)

	#截取注册页面图片,并保存到test目录下page.png
	driver.get_screenshot_as_file("F:\\testAndStudy\\test\\page.png")

	#打开test目录下,注册页面的图片
	im = Image.open("F:\\testAndStudy\\test\\page.png")

	#根据上面获取到的图片验证码在页面的坐标,将图片验证码剪切出来,保存为verifyCode.png
	region = im.crop(cut_img)
	region.save("F:\\testAndStudy\\test\\verityCode.png")

	#打开截取后的图片验证码
	verityCode = Image.open("F:\\testAndStudy\\test\\verityCode.png")
	sleep(1)

	#调用Pytesseract的image_to_string()方法识别二维码图片,并复制到code中
	code = pytesseract.image_to_string(verityCode)
	print code

if __name__=="__main__":
	click_register_link()

  

第二种方法:

使用pytesser 模块也是可以对图片的内容进行识别,不过这个识别率会稍微好点,但是,识别的结果还是一样没有达到预期的结果。

下载地址:https://code.google.com/p/pytesser/downloads/detail?name=pytesser_v0.0.1.zip

安装:下载好后,直接解压到Python27\Lib\site-packages下即可,不过由于这个模块本身没有带__init__.py文件,所以,在导入时

会报找不到pytesser模块错误,需要在pytesser下自己建一个__init__.py文件。另外也是要修改pytesser的tesseract_exe_name参数,具体如下

#-*-encoding:utf-8-*-
from pytesser import *
from selenium import webdriver
from PIL import Image,ImageGrab,ImageEnhance
from time import sleep


driver=webdriver.Chrome()
driver.get("http://localhost:8081/tshop/index.php?con=simple&act=login")

def click_register_link():
	driver.find_element_by_link_text(u"立即注册").click()
	sleep(0.5)

	verifyCode=driver.find_element_by_xpath('//*[@id="captcha_img"]').rect  #获取二维码在页面的位置
	start_x=int(verifyCode["x"])
	start_y=int(verifyCode["y"])
	end_x=verifyCode["width"]+start_x   #开始坐标+结束坐标点
	end_y=verifyCode["height"]+start_y  #开始坐标+结束坐标点
	cut_img=(start_x,start_y,end_x,end_y)

	#截取注册页面图片,并保存到test目录下page.png
	driver.get_screenshot_as_file("F:\\testAndStudy\\test\\page.png")

	#打开test目录下,注册页面的图片
	im = Image.open("F:\\testAndStudy\\test\\page.png")

	#根据上面获取到的图片验证码在页面的坐标,将图片验证码剪切出来,保存为verifyCode.png
	region = im.crop(cut_img)
	region.save("F:\\testAndStudy\\test\\verityCode.png")


def print_verityCode():
	#图片验证码处理及打印内容
	sleep(1)
	verityCode = Image.open("F:\\testAndStudy\\test\\verityCode.png")

	#图片处理
	im=Image.open("F:\\testAndStudy\\test\\verityCode.png")
	imgry=im.convert("L")
	# imgry.show()

	threshold = 130
	table=[]
	for i in range(256):
		if i < threshold:
			table.append(0)
		else:
			table.append(1)
	# print table
	out = imgry.point(table,"1")
	out.show()

	#打印验证码内容
	code1 = pytesser.image_file_to_string("F:\\testAndStudy\\test\\verityCode.png")
	code = pytesser.image_to_string(out)

	print code1
	print code

if __name__=="__main__":
	click_register_link()
	print_verityCode()

总结:这两种方法,都是识别图片内容,但是,拿来做图片验证码的识别率相对而言,效果不是很好,因为现在的图片验证码的内容不是大多字符是重叠或者相连的。

导致内容无法识别或者出现识别错误的情况,而且这种识别错误概率非常高(自己跑了好多次,偶尔只有一两次能识别正确的)。

后面在网上找了一些方法,据说可以提高识别的成功率,但目前没有试过也不敢说,有感兴趣的朋友可以去试试,地址:https://www.cnblogs.com/cnlian/p/5765871.html

 

 

转载于:https://www.cnblogs.com/JcHome/p/10809133.html

您可能感兴趣的与本文相关的镜像

ComfyUI

ComfyUI

AI应用
ComfyUI

ComfyUI是一款易于上手的工作流设计工具,具有以下特点:基于工作流节点设计,可视化工作流搭建,快速切换工作流,对显存占用小,速度快,支持多种插件,如ADetailer、Controlnet和AnimateDIFF等

在使用 Java 和 Selenium 实现图片验证码识别时,通常需要结合截图、图像处理和第三方识别工具来完成整个流程。以下是实现的主要方法和步骤: ### 3.1 获取网页截图并定位验证码图片 通过 Selenium 提供的 `TakesScreenshot` 接口,可以截取当前浏览器窗口的内容。由于验证码通常嵌入在页面的某个特定位置,因此需要先获取整个页面的截图,并根据验证码图片在页面中的位置进行裁剪。 ```java File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE); ``` 截图保存后,可以使用图像处理工具(如 Java 的 `BufferedImage`)对图像进行裁剪,提取验证码图片部分[^4]。 ### 3.2 使用 Tesseract OCR 进行验证码识别 Tesseract 是一个开源的 OCR(光学字符识别)引擎,可以用于识别图像中的文本内容。在 Java 中,可以通过 `Tess4J` 库来调用 Tesseract 引擎进行识别。 ```java import net.sourceforge.tess4j.Tesseract; import net.sourceforge.tess4j.TesseractException; public class CaptchaRecognition { public static void main(String[] args) { Tesseract tesseract = new Tesseract(); tesseract.setDatapath("path/to/tessdata"); // 设置训练数据路径 try { String result = tesseract.doOCR(new File("path/to/captcha_image.png")); System.out.println("识别结果: " + result); } catch (TesseractException e) { e.printStackTrace(); } } } ``` 需要注意的是,Tesseract 对于复杂验证码(如带干扰线、背景噪声、扭曲字体等)的识别率较低,可能需要对图像进行预处理以提高识别准确率[^3]。 ### 3.3 使用第三方识别接口提升识别准确率 对于复杂验证码,推荐使用专业的第三方识别服务,如联众验证码识别平台等。这些平台通常提供 RESTful API 接口,可以将本地验证码图片上传后返回识别结果。 实现流程如下: 1. 截图并保存验证码图片到本地; 2. 使用 HTTP 客户端(如 Apache HttpClient)将图片上传至识别平台; 3. 解析返回结果并用于后续自动化操作。 示例代码片段(使用 HttpClient): ```java HttpClient client = HttpClientBuilder.create().build(); HttpPost post = new HttpPost("https://api.jsdati.com/upload"); MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.addBinaryBody("file", new File("path/to/captcha_image.png")); HttpEntity entity = builder.build(); post.setEntity(entity); HttpResponse response = client.execute(post); String result = EntityUtils.toString(response.getEntity()); System.out.println("识别结果: " + result); ``` 这种方式识别准确率高,适用于商业自动化测试和爬虫场景[^2]。 ### 3.4 验证码识别的注意事项 - **验证码图像预处理**:包括灰度化、二值化、去噪、切割等操作,可显著提升识别效果; - **图像质量**:截图分辨率和清晰度对识别结果有直接影响; - **识别服务选择**:不同平台对不同类型的验证码识别能力不同,建议根据验证码复杂程度选择合适的识别接口; - **验证码动态加载**:若验证码为异步加载或嵌套在 `<iframe>` 中,需确保元素加载完成后再进行截图和识别。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值