数字验证码破解

爬虫中,有时候需要破解验证码,所以这里就来讲一下,如何破解验证码。

最简单的数字、字母验证码破解

像这个样子的验证码。我们可以直接利用ocr来破解

ocr介绍

百度百科

python中使用ocr

ocr简单运用

我们需要下载ocr相关的软件,这样才能在python中进行ocr识别。

  1. windows下的安装,
  2. 在python中安装相关依赖
    • python中安装相关依赖: pip install tesserocr pillow
  3. 应用
    我们就将上面哪个验证码变成数字
import tesserocr
from PIL import image
image = Image.open("captha1.jpg")  # 这里就相当于将图片数字化。
ans=tesserocr.image_to_text(image)  # 这里就是将数字化的图片进行ocr处理。
'''
:除了image_to_text,这里还有tesserocr的 image_to_text还有file_to_text。用法也很简单,只要将文件所 
:在的路径加上去就可以了
'''
print(ans)

上面代码运行之后的结果就是2127了。

ocr增加难度

这样子可以将简单的验证码进行ocr化,但是复杂一点的,像这个。这个就要涉及到灰度处理、二值化、降噪。这里先来说明一下为什么能进行这三项处理
因为图像在电脑里面就是像素点,每个像素点就是一个3个元素的元组,这三个元素也就分别代表着RGB。
那么我们如何知道这三个元素的值呢?下面的代码能将一张图片的rgb值以数字为基准遍历打印出来

from PIL import Image
img = Image.open("captcha1.jpg")
 width,height=img.size
 for i in range(width):
     for j in range(height):
		     piexl=image.load()[i,j]
				 print(piexl)

这样子就是遍历打印一张图片的像素点。
灰度处理、二值化、降噪。就是设置一个阀值,将不符合这个阀值的所有像素点变成白色,将符合这个阀值的所有像素点变成黑色。这样子的化就达到了灰度处理、二级化和减噪的作用,代码如下
在进行二级化前,需要进行灰度和黑白化处理,代码如下

# 模式L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。
    Img = img.convert('L')
    
    # 黑白化处理,自定义灰度界限,大于这个值为黑色,小于这个值为白色
    threshold = 200

    table = []
    for i in range(256):
        if i < threshold:
            table.append(0)
        else:
            table.append(1)

    # 图片二值化
    photo = Img.point(table, '1')
    photo.save("BuildImageCode2.jpg")

进行上面两步灰度和黑白化后,得到的photo就可以进行降噪处理

def judge(pixl):

    THRESHOLD = 80

    if pixl>THRESHOLD:
        return 1
    else:
        return 0
def depoint(img):
    """传入二值化后的图片进行降噪"""
    pixdata = img.load()
    w,h = img.size
    for y in range(1,h-1):
        for x in range(1,w-1):
            count = 0
            if judge(pixdata[x,y-1]):#上
                count = count + 1
            if judge(pixdata[x,y+1]):#下
                count = count + 1
            if judge(pixdata[x-1,y]):#左
                count = count + 1
            if judge(pixdata[x+1,y]):#右
                count = count + 1
            if judge(pixdata[x-1,y-1]):#左上
                count = count + 1
            if judge(pixdata[x-1,y+1]):#左下
                count = count + 1
            if judge(pixdata[x+1,y-1]):#右上
                count = count + 1
            if judge(pixdata[x+1,y+1]):#右下
                count = count + 1
            if count > 4:
                pixdata[x,y] = 255
    
    return img

就可以了,完整的code如下

import tesserocr
from PIL import Image
def judge(pixl):
    THRESHOLD = 80
    if pixl>THRESHOLD:
        return 1
    else:
        return 0
def depoint(img):
    """传入二值化后的图片进行降噪"""
    pixdata = img.load()
    w,h = img.size
    for y in range(1,h-1):
        for x in range(1,w-1):
            count = 0
            if judge(pixdata[x,y-1]):#上
                count = count + 1
            if judge(pixdata[x,y+1]):#下
                count = count + 1
            if judge(pixdata[x-1,y]):#左
                count = count + 1
            if judge(pixdata[x+1,y]):#右
                count = count + 1
            if judge(pixdata[x-1,y-1]):#左上
                count = count + 1
            if judge(pixdata[x-1,y+1]):#左下
                count = count + 1
            if judge(pixdata[x+1,y-1]):#右上
                count = count + 1
            if judge(pixdata[x+1,y+1]):#右下
                count = count + 1
            if count > 4:
                pixdata[x,y] = 255
    return img
def heibaihua(img):
    # 模式L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。
    Img = img.convert('L')
    # 黑白化处理,自定义灰度界限,大于这个值为黑色,小于这个值为白色
    threshold = 200
    table = []
    for i in range(256):
        if i < threshold:
            table.append(0)
        else:
            table.append(1)
    # 图片二值化
    photo = Img.point(table, '1')
    photo.save("BuildImageCode2.jpg")
    return photo
img= Image.open("C://Users/asus/Desktop/BuildImageCode.jpg")  # 这里就相当于将图片数字化。
img = heibaihua(img)
img = depoint(img)
ans=tesserocr.image_to_text(img)
print(ans)
由于数字加减验证码的规则比较简单,可以通过手动识别的方式来破解。 首先,我们需要通过 Python 的 PIL 库来读取验证码图片,并将其转换为灰度图像。然后,我们可以使用图像处理技术来识别数字和符号,并计算出验证码的结果。 以下是一个示例代码,可以对数字加减验证码进行破解: ```python from PIL import Image # 读取验证码图片 im = Image.open('captcha.png') # 转换为灰度图像 im = im.convert('L') # 图像处理函数,用于处理数字和符号 def process_digit(im, x, y): digits = { (0, 1, 0, 1, 0, 1, 1, 1, 1, 1): 0, (0, 0, 0, 1, 0, 0, 0, 1, 0, 0): 1, (0, 1, 0, 0, 1, 1, 1, 0, 1, 1): 2, (0, 1, 0, 0, 1, 1, 0, 1, 1, 1): 3, (0, 0, 0, 1, 1, 1, 0, 1, 0, 0): 4, (0, 1, 0, 1, 1, 0, 0, 1, 1, 1): 5, (0, 1, 0, 1, 1, 0, 1, 1, 1, 1): 6, (0, 1, 0, 0, 0, 1, 0, 1, 0, 0): 7, (0, 1, 0, 1, 1, 1, 1, 1, 1, 1): 8, (0, 1, 0, 1, 1, 1, 0, 1, 1, 1): 9, (0, 0, 1, 0, 0, 0, 0, 0, 0, 0): '+', (0, 0, 1, 0, 0, 0, 0, 1, 0, 0): '-', } # 提取数字和符号的像素 pixels = [] for i in range(5): for j in range(7): pixel = im.getpixel((x + i, y + j)) pixels.append(pixel) # 识别数字和符号 digit = digits.get(tuple(pixels)) return digit # 获取验证码数字和符号 digits = [] for i in range(4): digit = process_digit(im, 13 + i * 18, 2) digits.append(digit) # 计算验证码的结果 result = eval(''.join(map(str, digits))) print('验证码:', digits) print('结果:', result) ``` 在上面的代码中,我们定义了一个图像处理函数 `process_digit`,该函数用于提取数字和符号的像素,并识别其对应的数字或符号。我们还定义了一个字典 `digits`,其中包含了数字和符号对应的像素值,用于识别验证码中的数字和符号。 在主函数中,我们使用 `process_digit` 函数来获取验证码数字和符号,并使用 Python 内置函数 `eval` 来计算验证码的结果。 这个方法的缺点是如果验证码中包含了噪点或干扰线,可能会影响识别的准确性。但是对于一般的数字加减验证码来说,这种方法已经足够有效了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值