热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

第二十三节: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 &#61; image.point(table, &#39;1&#39;) # 二值化处理后的副本(1表示二值化)
48 image.show()
49 result &#61; 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 &#61; "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
60 verif_list &#61; []
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__ &#61;&#61; &#39;__main__&#39;:
69 img_path &#61; "D:\photo\image" # 文件夹目录
70 img_path &#61; img_path &#43; "\VerificationCode.png" # 验证码图片所在的目录及名称
71 img_url &#61; "http://my.cnki.net/elibregister/CheckCode.aspx" # 验证码url
72 get_image(img_path,img_url) # 获取验证码图片
73 reset_image_size(img_path) # 调整验证码图片大小
74 result &#61; read_image(img_path) # 读取验证码图片内容
75 verif_info &#61; VerifInfo(result) # 验证码内容数据处理
76 verif_len &#61; len(verif_info) # 验证码识别长度
77 if verif_len &#61;&#61; 4 and verif_info:
78 print(verif_info)
79 else:
80 pass

图片字母数字验证码识别

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

 

输出的结果为&#xff1a;FZug

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

转:https://www.cnblogs.com/zhaco/p/10960339.html



推荐阅读
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
  • 知识图谱表示概念:知识图谱是由一些相互连接的实体和他们的属性构成的。换句话说,知识图谱是由一条条知识组成,每条知识表示为一个SPO三元组(Subject-Predicate-Obj ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
  • 本文介绍了贝叶斯垃圾邮件分类的机器学习代码,代码来源于https://www.cnblogs.com/huangyc/p/10327209.html,并对代码进行了简介。朴素贝叶斯分类器训练函数包括求p(Ci)和基于词汇表的p(w|Ci)。 ... [详细]
  • 概述H.323是由ITU制定的通信控制协议,用于在分组交换网中提供多媒体业务。呼叫控制是其中的重要组成部分,它可用来建立点到点的媒体会话和多点间媒体会议 ... [详细]
  • OCR:用字符识别方法将形状翻译成计算机文字的过程Matlab:商业数学软件;CUDA:CUDA™是一种由NVIDIA推 ... [详细]
  • 本人学习笔记,知识点均摘自于网络,用于学习和交流(如未注明出处,请提醒,将及时更正,谢谢)OS:我学习是为了上 ... [详细]
  • Matlab 中的一些小技巧(2)
    1.Ctrl+D打开子程序  在MATLAB的Editor中,将输入光标放到一个子程序名称中间,然后按Ctrl+D可以打开该子函数的m文件。当然这个子程序要在路径列表中(或在当前工作路径中)。实际上 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
author-avatar
卫宇欢试试
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有