⚡爬虫高级篇⚡五行代码识别验证码—— ddddocr(带带弟弟OCR)

     阅读:46

📣小白练手专栏,适合刚入手的新人欢迎订阅编程小白进阶

📣python有趣练手项目里面包括了像《机器人尬聊》《恶搞程序》这样的有趣文章,可以让你快乐学python练手项目专栏

📣另外想学JavaWeb进厂的同学可以看看这个专栏:传送们

📣这是个面试和考研的算法练习我们一起加油上岸之路

💠导读

前段时间在学校做项目的时候接触了深度学习的图像识别这一块,不过我作为一个小白刚入门就想做到精度极高难度可想而知,除非调用API接口。在为项目奔波的时候找到了一个关于验证码识别的练手项目但是,当时人家用的是pillowpytesseract 虽然使用已经较为方便了而且精度也不是很差,但是肥学还是不满足在苦苦搜寻下找到了一个可以几行代码就可以解决的库名为——ddddocr据说谐音为带带弟弟OCR正好用来破解爬虫里面的验证码
.
.
.

💠开启验证之旅

💠简介

Github地址:传送门

环境要求:

python >= 3.8

Windows/Linux/Macox..

大家要是想试试这个功能又苦于python版本是3.8以下的话可以下载Anaconda另外建个环境将他们分离这样也不至
🌸 🌸 🌸
参数说明:

Ddddocr 接受两个参数

参数名默认值说明
use_gpuFalseBool 是否使用gpu进行推理,如果该值为False则device_id不生效
device_id0int cuda设备号,目前仅支持单张显卡

classification

参数名默认值说明
img0bytes 图片的bytes格式

🌸 🌸 🌸

💠初级实测

安装库文件

pip install ddddocr

test.jpg
在这里插入图片描述

import ddddocr
import time
begin=time.time()
ocr = ddddocr.DdddOcr()

with open('test.png', 'rb') as f:

    img_bytes = f.read()

res = ocr.classification(img_bytes)
finish=time.time()
print("结果:")
print(res)
print("用时:%s 秒" % str(finish-begin))

结果:
7364
用时:0.10026359558105469

怎么样是不是很简单,但是这个验证码有点太简单了我们来点复杂一点点的。
.
.
.

💠升级

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
觉得不够过瘾我亲自手写了一个,试试它的效果吧一起来看看。

import ddddocr
import time
begin=time.time()
arr=[]
ocr = ddddocr.DdddOcr()
for i in range(1,5):
	with open(('%d.png'%i), 'rb') as f:
    	img_bytes = f.read()

	res = ocr.classification(img_bytes)
	arr.append(res)
finish=time.time()
print(arr)
print("用时:%s 秒" % str(finish-begin))
['uwv6','7482','DWSe','feixue']
用时:0.13045329758155361

结果可以看出第三章照片的w背换成W除了大小写以外其他好像没有什么问题,大家可以试试。

💠制作验证码

只是会破解不行我们这次来个彻底的,上手做一个。原理很简单就是简单的随机函数和PIL库的使用

from PIL import Image,ImageDraw,ImageFont
import random
def getRandomColor():
   r = random.randint(0, 255)
   g = random.randint(0, 255)
   b = random.randint(0, 255)
   return (r,g,b)
def getRandomStr():
   num_random = str(random.randint(1,9))
   random_upper_alpha = chr(random.randint(65,90))
   random_char = random.choice([num_random,random_upper_alpha])
   return random_char
image = Image.new('RGB',(120,40),(255,255,255))
draw = ImageDraw.Draw(image)
font = ImageFont.truetype(r'K:\msyh.ttc',size=24)
for i in range(4):
   draw.text((10+i*30,10),getRandomStr(),getRandomColor(),font=font)
width = 120
height = 40
for i in range(5):
   x1 = random.randint(0,width)
   x2 = random.randint(0,width)
   y1 = random.randint(0,height)
   y2 = random.randint(0,height)
   draw.line((x1,x2,y1,y2),fill=getRandomColor())
for i in range(20):
   draw.point([random.randint(0,width),random.randint(0,height)],fill=getRandomColor())
   x = random.randint(0,width)
   y = random.randint(0,height)
   draw.arc((x,y,x+5,y+5),0,90,fill=getRandomColor())
image.save('feixue.jpg')

💠结尾

另外大家猜猜要是换成汉字它能不能识别??? 这里不久不揭晓答案了,欢迎大佬们评论区告诉我们答案。
今天的分享就到这里了。谢谢大佬们的观看,可以的话给个🌸 🌸 🌸 三联 🌸 🌸 🌸再走吧!!

📣小白练手专栏,适合刚入手的新人欢迎订阅编程小白进阶
📣python有趣练手项目,可以让你快乐学python练手项目专栏

📣另外想学JavaWeb进厂的同学可以看看这个专栏:传送们
📣这是个面试和考研的算法练习我们一起加油上岸之路