验证码的识别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了验证码的识别相关的知识,希望对你有一定的参考价值。
参考技术A验证码是一种反爬虫的措施,目前的验证码主要有图像验证码、极验滑动验证码、点触验证码、微博宫格验证码等。根据不同类型的验证码,有以下识别的方法。
利用OCR字符识别技术来实现,需要安装tesserocr库进行识别。 因为验证码图片的背景有些多余的线条、颜色会干扰识别效果,因此可以在识别前对图片进行二值化处理或灰度处理
它通过拖动滑块来拼合图像进而实现验证。识别的主要思路: 利用selenium来模拟点击验证按钮,获取包含缺口的图片,将原图与其对比,识别出缺口位置,模拟拖动。模拟拖动时需要注意,不能匀速,因为人无法做到匀速拖动,因此会导致识别识别。比较好的办法就是,模拟加速和减速运动来进行拖动。前段先加速后段在减速。
这种验证码主要有两种,一种是点击图中所以符合要求的图片,二是按照顺序点击指定的文字。对于这种验证码,可以利用第三方平台来实现识别,比如超级鹰。具体思路 将验证码的图片传入到第三方平台上,然后根据第三方平台范围的坐标位置,进行依次点击。
这种验证码的宫格之间会有一条指示连线,指示了用户需要滑动的轨迹。如果要识别这种验证码,就需要识别箭头的指示方向,因此需要首先找到所有箭头的位置,然后计算像素点的变化规律。这个方法比较麻烦。对于这种验证码可以采用另一种思路: 模板匹配,即首先将所有可能出现的验证码图片收集下来,这样每个图片的滑动顺序已知,构成一个模板库。在每一次识别时,将原图与模板库中的图片进行匹配即可。
验证码的识别 -01 -图形验证码的识别
验证码的识别 -01 -图形验证码的识别
1. 准备工作
- 1. 下载安装 tesseract 下载地址
- 下载完成后双击,安装程序, 可以勾选Additional language data(download)选项来安装 OCR 识别支持的语言包,这样 OCR 便可以识别多国语言
- 将tesseract 配置环境变量
- 将tesseract的语言包添加到环境变量中,在环境变量中新建一个系统变量,变量名称为TESSDATA_PREFIX,tessdata是放置语言包的文件夹,一般在你安装tesseract的目录下,即tesseract的安装目录就是tessdata的父目录,把TESSDATA_PREFIX的值设置为它即可
- pip安装tesserocr文件, 注意pip install tesserocr 在window系统上安装总是失败, 需要去github上下载 与我们安装的tesseract版本对应的 tesserocr 的 .whl文件,进行安装,
2. 获取验证码图片
import os import requests from uuid import uuid4 from selenium import webdriver browser = webdriver.Firefox() browser.get(‘http://my.cnki.net/elibregister/commonRegister.aspx‘) browser.implicitly_wait(2) os.mkdir(‘picture‘) for i in range(5): image = browser.find_element_by_xpath(‘//*[@id="checkcode"]‘) image_url = image.get_attribute(‘src‘) image_content = requests.get(image_url).content image_path = os.path.join(‘picture‘, f‘uuid4().jpg‘) with open(image_path, ‘wb‘) as f: f.write(image_content) image.click() browser.implicitly_wait(2)
3. 识别测试
import tesserocr from PIL import Image image = Image.open(‘picture/1.jpg‘) result = tesserocr.image_to_text(image) #将image对象转换为文字 print(result) print(tesserocr.file_to_text(‘picture/1.jpg‘)) #将文件对象转换为文字
4. 验证码处理
转化为灰度图像和二值化处理
image = image.convert(‘L‘) #将图片转化为灰度图像 image.show() image = image.convert(‘1‘) #将图片进行二值化处理 image.show()
import tesserocr from PIL import Image image = Image.open(‘picture/2.jpg‘) image = image.convert(‘L‘) threshold = 105 #数值越小, 图片中的像素点越少, 空白越多 table = [] for i in range(256): if i < threshold: table.append(0) else: table.append(1) image = image.point(table,‘1‘) image.show() result = tesserocr.image_to_text(image)
以上是关于验证码的识别的主要内容,如果未能解决你的问题,请参考以下文章