第二十三节:scrapy爬虫识别验证码(二)图片验证码识别
图片验证码基本上是有数字和字母或者数字或者字母组成的字符串,然后通过一些干扰线的绘制而形成图片验证码。
例如:知网的注册就有图片验证码
首先我们需要获取验证码图片,通过开发者工具我们可以得到验证码url链接
其次就是通过Pillow类库和tesserocr进行识别,代码如下:
# -*- coding:utf-8 -*-
import tesserocr
from PIL import Image
import requests # 通过url链接获取验证码图片,并写入本地文件夹里
def get_image(path,url):
"""
:param path: 文件夹路径
:param url: 验证码url链接
"""
respon = requests.get(url=url) # 请求验证码url
with open(path,"wb") as file:
file.write(respon.content) # 将验证码写到本地 # 由于验证码图片太小,需要对验证码图片放大处理,以便识别
def reset_image_size(image_path):
"""
:param image_path: 图片所在的路径
:return:
"""
image = Image.open(fp=image_path) # 打开图片
pic_resize = 5 # 设置图片放大或者缩小倍数
(x, y) = image.size # 获取图片的大小
x_s = int(x * pic_resize) # 放大5倍(可调)
y_s = int(y * pic_resize) # 放大5倍(可调)
out = image.resize((x_s, y_s), Image.ANTIALIAS) # ANTIALIAS表示高质量图片
out.save(image_path) # 读取验证码图片文本
def read_image(image_path):
"""
:param image_path: 验证码图片路径
:return:
"""
image = Image.open(fp=image_path) # 打开验证码图片
image = image.convert('L') # 将验证码图片转换为灰度图(L表示灰度图)
threshold = 127 # 设置灰度图二值化阈值
table = []
for i in range(256): # 像素为256
if i < threshold:
table.append(0)
else:
table.append(1)
image = image.point(table, '') # 二值化处理后的副本(1表示二值化)
image.show()
result = tesserocr.image_to_text(image) # 验证码图片转换为文本
return result # 验证码识别信息脏数据处理
def VerifInfo(result):
"""
:param result: 验证码图片通过初步识别后得到的脏数据
:return:
"""
verif_str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
verif_list = []
for i in result:
if i in verif_str:
verif_list.append(i)
return "".join(verif_list) if __name__ == '__main__':
img_path = "D:\photo\image" # 文件夹目录
img_path = img_path + "\VerificationCode.png" # 验证码图片所在的目录及名称
img_url = "http://my.cnki.net/elibregister/CheckCode.aspx" # 验证码url
get_image(img_path,img_url) # 获取验证码图片
reset_image_size(img_path) # 调整验证码图片大小
result = read_image(img_path) # 读取验证码图片内容
verif_info = VerifInfo(result) # 验证码内容数据处理
verif_len = len(verif_info) # 验证码识别长度
if verif_len == 4 and verif_info:
print(verif_info)
else:
pass
图片字母数字验证码识别
最后就是看看识别的效果吧。前者为原始验证码图片,后者是经过二值化处理的图片。
输出的结果为:FZug
显然使用tesserocr识别还是有误差的,以后可以用深度学习的方式训练处一个模型,可以提高识别效率,后期会跟进实现的。
第二十三节:scrapy爬虫识别验证码(二)图片验证码识别的更多相关文章
- scrapy爬虫学习系列二:scrapy简单爬虫样例学习
系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备: http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...
- centos LNMP第一部分环境搭建 LAMP LNMP安装先后顺序 php安装 安装nginx 编写nginx启动脚本 懒汉模式 mv /usr/php/{p.conf.default,p.conf} php运行方式SAPI介绍 第二十三节课
centos LNMP第一部分环境搭建 LAMP安装先后顺序 LNMP安装先后顺序 php安装 安装nginx 编写nginx启动脚本 懒汉模式 mv /usr/local/php/{ ...
- (转)第二十三节 inotify事件监控工具
第二十三节 inotify事件监控工具 标签(空格分隔): Linux实战教学笔记-陈思齐 原文:http://www.cnblogs.com/chensiqiqi/p/6542268.html 第1 ...
- 风炫安全WEB安全学习第二十三节课 利用XSS获取COOKIE
风炫安全WEB安全学习第二十三节课 利用XSS获取COOKIE XSS如何利用 获取COOKIE 我们使用pikachu写的pkxss后台 使用方法: <img src="http:/ ...
- SpringCloud微服务实战——搭建企业级开发框架(二十四):集成行为验证码和图片验证码实现登录功能
随着近几年技术的发展,人们对于系统安全性和用户体验的要求越来越高,大多数网站系统都逐渐采用行为验证码来代替图片验证码.GitEgg-Cloud集成了开源行为验证码组件和图片验证码,并在系统中添加可配置 ...
- 潭州课堂25班:Ph201805201 django 项目 第十课 自定义错误码,完成图片验证码,用户是否被注册功能 (课堂笔记)
把 视图传到前台的 JsonResponse(data=data) 先进行处理,之后再传到前台, 处理:引用自定义错误代码,把错误代码返回给前台,前台根据错误代码中文提示 class Code: O ...
- Python识别字符型图片验证码
前言 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越来越严峻.本文介绍了一套字符验证码识别的完整流程,对于验 ...
- 文字识别还能这样用?通过Python做文字识别到破解图片验证码
前期准备 1. 安装包,直接在终端上输入pip指令即可: # 发送浏览器请求 pip3 install requests # 文字识别 pip3 install pytesseract # 图片处理 ...
- 【图片识别】java 图片文字识别 ocr (转)
http://www.cnblogs.com/inkflower/p/6642264.html 最近在开发的时候需要识别图片中的一些文字,网上找了相关资料之后,发现google有一个离线的工具,以下为 ...
随机推荐
- P4324 [JSOI2016]扭动的回文串
传送门 对\(A\).\(B\)串各跑一遍\(manacher\),求出第\(1\).\(2\)类扭动回文串的最大长度. 考虑第三类的扭动回文串\(S(i,j,k)\),一定可以表示为\(A(i,l) ...
- [poj3744] Scout YYF I【概率dp 数学期望】
传送门:http://poj.org/problem?id=3744 令f(i)表示到i,安全的概率.则f(i) = f(i - 1) * p + f(i - 2) * (1 - p),若i位置有地雷 ...
- 写给W小姐的一封信
生活 琐碎 Hallo,Preaty.对于跟人说话,我很不擅长如何开头.我不知道什么样的开头是符合我在别人心目中我应有的形象.我不知道什么样的开头符合别人预想中与我相匹配的内容.或者说什么的开头才是一 ...
- fastDFS shiro权限校验 redis FreeMark页面静态化
FastDFS是一个轻量级分布式文件系统, 使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传.下载等服务 FastDFS服务端有两个角色:跟踪器(tracker)和存储节点( ...
- 手写一套迷你版HTTP服务器
本文主要介绍如何通过netty来手写一套简单版的HTTP服务器,同时将关于netty的许多细小知识点进行了串联,用于巩固和提升对于netty框架的掌握程度. 服务器运行效果 服务器支持对静态文件css ...
- Oracle Mysql的jdbc连接
Oracle和MySql的jdbc或连接池中的连接,写下来以便随时参考 Oracle: driverClassName=oracle.jdbc.driver.OracleDriver url=jdbc ...
- 表单里的button默认是submit类型
今天很坑爹,周六一大早加班开始码代码,本来想做数据加密测试,于是乎用tp框架搭建了一个应用环境,二话不说,开始码码. 但,今天一大早就栽坑!直到同事喊吃饭还在坑里出不来!吃完饭继续码,最后码的我想哭o ...
- c# winform如何屏蔽键盘上下左右键
重写事件: protected override bool ProcessDialogKey(Keys keyData) { if (keyData == Keys.Up || keyData == ...
- 迅为7寸Android嵌入式安卓触摸屏,工业一体机方案
嵌入式安卓触摸屏板卡介绍-工业级核心板: 嵌入式安卓触摸屏功能接口介绍: 品质保障: 核心板连接器:进口连接器,牢固耐用,国产连接器无法比拟(为保证用户自行设计的产品品质,购买核心板用户可免费赠送底板 ...
- HDU_1710_二叉树前序中序确定后序
2018-3-6 按照王道机试书上的思路再做了一遍,先根据先序和中序建树,然后后序遍历. 静态分配数组用于建树,可以返回数组地址当作结点指针. #include<iostream> #in ...