selenium (八) 图片验证码识别

博客介绍了使用Python进行图片内容识别的相关工具安装,包括Image模块、pytesseract和tesseract - ocr识别引擎。还提到了pytesser模块的使用。但指出这两种方法用于图片验证码识别时,识别率较低,因验证码字符重叠相连,文末给出可能提高成功率的方法链接。

 

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

### 如何使用 Selenium 实现图片验证码识别 #### 图片验证码识别流程概述 为了实现基于 Selenium图片验证码自动识别,通常涉及以下几个方面的工作: - **获取验证码图片**:通过 Selenium 获取网页上的验证码图片,并将其保存到本地文件系统中。 - **处理验证码图片**:对下载下来的图片做预处理工作,比如裁剪、灰度化等操作来提高后续识别准确性。 - **调用 OCR 工具进行字符识别**:利用第三方库如 DdddOcr 或者 Tess4J 来解析经过处理后的图像内容。 #### Java 中的具体实施方法 ##### 准备阶段 在项目里引入必要的依赖包,包括但不限于用于控制浏览器行为的 `org.openqa.selenium` 及其子模块,还有负责执行屏幕截图功能的相关接口 `OutputType`, `TakesScreenshot` 等[^2]。 ```java import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.apache.commons.io.FileUtils; // ...其他导入语句... ``` ##### 抓取并保存验证码图片 当目标网站加载完成后,定位到包含验证码元素的位置,接着对该区域执行截图命令并将结果存储至指定路径下以便进一步分析[^4]。 ```java WebDriver driver = new ChromeDriver(); driver.get("https://example.com/login"); WebElement captchaElement = driver.findElement(By.id("captcha")); File screenshot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); File targetLocation = new File("/path/to/save/captcha.png"); FileUtils.copyFile(screenshot, targetLocation); driver.quit(); // 关闭驱动实例 ``` ##### 应用 OCR 进行文字提取 这里选用 Tesseract 作为光学字符识别引擎,在此之前可能还需要安装对应的运行环境和支持语言包。完成配置之后就可以创建 ITesseract 对象来进行实际的文字检测了。 ```java ITesseract tesseract = new Tesseract(); tesseract.setDatapath("/usr/share/tesseract-ocr/4.00/tessdata"); // 设置 tessdata 路径 String resultText = null; try { resultText = tesseract.doOCR(targetLocation); } catch (TesseractException e) { System.err.println(e.getMessage()); } System.out.println(resultText); // 输出识别出来的文本串 ``` #### Python 版本下的替代方案 对于偏好 Python 编程语言的人来说,则可以直接借助于 Pytesseract 和 Pillow(PIL Fork)这两个强大的开源工具集快速搭建起一套相似的功能框架[^1]。 ```python from selenium import webdriver from PIL import Image import pytesseract import io def get_captcha_text(image_url): options = webdriver.ChromeOptions() browser = webdriver.Chrome(options=options) try: browser.get('http://yourwebsite.com') element = browser.find_element_by_id('captcha') # 替换成真实的 ID 值 location = element.location size = element.size png = browser.get_screenshot_as_png() im = Image.open(io.BytesIO(png)) left = location['x'] top = location['y'] right = location['x'] + size['width'] bottom = location['y'] + size['height'] im = im.crop((left, top, right, bottom)) text = pytesseract.image_to_string(im) return text finally: browser.close() if __name__ == '__main__': url = 'image URL here' print(get_captcha_text(url)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值