第二十三节:scrapy爬虫识别验证码(二)图片验证码识别

图片验证码基本上是有数字和字母或者数字或者字母组成的字符串,然后通过一些干扰线的绘制而形成图片验证码。

例如:知网的注册就有图片验证码

首先我们需要获取验证码图片,通过开发者工具我们可以得到验证码url链接

其次就是通过Pillow类库和tesserocr进行识别,代码如下:

 1 # -*- coding:utf-8 -*-
 2 import tesserocr
 3 from PIL import Image
 4 import requests
 5
 6 # 通过url链接获取验证码图片,并写入本地文件夹里
 7 def get_image(path,url):
 8     """
 9     :param path: 文件夹路径
10     :param url:  验证码url链接
11     """
12     respon = requests.get(url=url)      # 请求验证码url
13     with open(path,"wb") as file:
14         file.write(respon.content)      # 将验证码写到本地
15
16
17 # 由于验证码图片太小,需要对验证码图片放大处理,以便识别
18 def reset_image_size(image_path):
19     """
20     :param image_path: 图片所在的路径
21     :return:
22     """
23     image = Image.open(fp=image_path)   # 打开图片
24     pic_resize = 5                      # 设置图片放大或者缩小倍数
25     (x, y) = image.size                 # 获取图片的大小
26     x_s = int(x * pic_resize)           # 放大5倍(可调)
27     y_s = int(y * pic_resize)           # 放大5倍(可调)
28     out = image.resize((x_s, y_s), Image.ANTIALIAS)     # ANTIALIAS表示高质量图片
29     out.save(image_path)
30
31
32 # 读取验证码图片文本
33 def read_image(image_path):
34     """
35     :param image_path: 验证码图片路径
36     :return:
37     """
38     image = Image.open(fp=image_path)       # 打开验证码图片
39     image = image.convert(‘L‘)              # 将验证码图片转换为灰度图(L表示灰度图)
40     threshold = 127                         # 设置灰度图二值化阈值
41     table = []
42     for i in range(256):                    # 像素为256
43         if i < threshold:
44             table.append(0)
45         else:
46             table.append(1)
47     image = image.point(table, ‘1‘)         # 二值化处理后的副本(1表示二值化)
48     image.show()
49     result = tesserocr.image_to_text(image) # 验证码图片转换为文本
50     return result
51
52
53 # 验证码识别信息脏数据处理
54 def VerifInfo(result):
55     """
56     :param result: 验证码图片通过初步识别后得到的脏数据
57     :return:
58     """
59     verif_str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
60     verif_list = []
61     for i in result:
62         if i in verif_str:
63             verif_list.append(i)
64     return "".join(verif_list)
65
66
67
68 if __name__ == ‘__main__‘:
69     img_path = "D:\photo\image"                                 # 文件夹目录
70     img_path = img_path + "\VerificationCode.png"               # 验证码图片所在的目录及名称
71     img_url = "http://my.cnki.net/elibregister/CheckCode.aspx"  # 验证码url
72     get_image(img_path,img_url)                                 # 获取验证码图片
73     reset_image_size(img_path)                                  # 调整验证码图片大小
74     result = read_image(img_path)                               # 读取验证码图片内容
75     verif_info = VerifInfo(result)                              # 验证码内容数据处理
76     verif_len  = len(verif_info)                                # 验证码识别长度
77     if verif_len == 4 and verif_info:
78         print(verif_info)
79     else:
80         pass

图片字母数字验证码识别

最后就是看看识别的效果吧。前者为原始验证码图片,后者是经过二值化处理的图片。

输出的结果为:FZug

显然使用tesserocr识别还是有误差的,以后可以用深度学习的方式训练处一个模型,可以提高识别效率,后期会跟进实现的。

原文地址:https://www.cnblogs.com/zhaco/p/10960339.html

时间: 2024-11-07 09:21:09

第二十三节:scrapy爬虫识别验证码(二)图片验证码识别的相关文章

centos mysql 优化 第二十三节课

centos mysql  优化  第二十三节课 f

(转)第二十三节 inotify事件监控工具

第二十三节 inotify事件监控工具 标签(空格分隔): Linux实战教学笔记-陈思齐 原文:http://www.cnblogs.com/chensiqiqi/p/6542268.html 第1章,NFS存储服务器与backup备份服务器的搭建. 详细细节知识与搭建请关注: http://www.cnblogs.com/chensiqiqi/p/6514315.html Rsync数据同步工具 http://www.cnblogs.com/chensiqiqi/p/6530859.html

斯坦福第十八课:应用实例:图片文字识别(Application Example: Photo OCR)

18.1  问题描述和流程图 18.2  滑动窗口 18.3  获取大量数据和人工数据 18.4  上限分析:哪部分管道的接下去做 18.1  问题描述和流程图 图像文字识别应用所作的事是,从一张给定的图片中识别文字.这比从一份扫描文档中 识别文字要复杂的多. 为了完成这样的工作,需要采取如下步骤: 为了完成这样的工作,需要采取如下步骤: 1. 文字侦测(Text detection)——将图片上的文字与其他环境对象分离开来 2. 字符切分(Character segmentation)——将文

随机验证码、图片验证码和邮箱发送用户验证码

随机验证码.图片验证码和邮箱发送用户验证码 一.随机验证码 随机验证码的生成比较简单一般在注册用户的时候与邮箱或者手机信息接口相结合实现发送验证码功能,随机验证码只需要使用python内置的random随机数函数,调用random模块:import random,具体实现代码块 #随机验证码 def authCode(): code = '' for i in range(6): current = random.randrange(0,6)#randrange随机生成0-6的数字,但不包括6

第二十三节(String,StringBuffer,基础类型对应的 8 个包装类,日期相关类、 Random 数字 ,Enum枚举)下

/* java.lang.String 是字符串类型 注意:只要采用双引号赋值字符串,那么在编译期将会放到方法区中的字符串的常量池里, 如果是运行时对字符串.加或相减会放到堆中(放之前会先验证方法区中是否含有 相同的字符串常量,如果存在,把地址返回,如果不存在,先将字符串常量放到池中,然 后再返回该对象的地址 */ public class StringTest01{ // java的入口 public static void main(String[] args){ // 创建一个“abc”字

学习笔记第二十三节课

管道符和作业控制 管道符表示把一个文件的输出的内容, 传递给后面的命令. 比如wc-l 的用法 可以统计ls 下有多少个目录 文件. 还有之前用的find命令.可以列出当前目录下所有文件, 也可以用管道符. 以后会经常用管道符. ctrl+z 可以暂停一个任务., 可以用fg 恢复任务.(fg+暂停任务的id号 可以恢复指定的暂停任务.) jobs 命令 可以把已经停止的任务给列出来. bg可以把任务放在后台. vim的命令 可能显示的不够明显, 可以用 vmstat来做实验. 可以用bg把它放

第二十三节: EF性能篇(三)之基于开源组件 Z.EntityFrameWork.Plus.EF6解决EF性能问题

一. 开篇说明 EF的性能问题一直以来经常被人所吐槽,究其原因在于“复杂的操作在生成SQL阶段耗时长,且执行效率不高”,但并不是没有办法解决,从EF本身举几个简单的优化例子: ①:如果仅是查询数据,并不对数据进行增.删.改操作,查询数据的时候可以取消状态追踪. db.TestInfor.AsNoTracking().FirstOrDefault(); ②:用什么查什么,比如一张表有100多个字段,本次业务只需要5个字段,一定是select这5个字段,然后toList,而不是全部查询,再toLis

centos mysql 实战 第二十三节课

f

Scala入门到精通——第二十节 类型參数(二)

本节主要内容 Ordering与Ordered特质 上下文界定(Context Bound) 多重界定 类型约束 1. Ordering与Ordered特质 在介绍上下文界定之前,我们对scala中的Ordering与Ordered之间的关联与差别进行解说,先看Ordering.Ordered的类继承层次体系: 通过上面两个图能够看到,Ordering混入了java中的Comparator接口.而Ordered混入了java的Comparable接口.我们知道java中的Comparator是一