爬虫图片验证码处理

图片验证码处理

目前,很多网站为了防止爬虫爬取,登录时需要用户输入验证码。下面我们学习如何在爬虫程序中识别验证码。

其中包含验证码。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

页面中的验证码图片对应一个<img>元素,即一张图片,浏览器加载完登录页面后,会携带之前访问获取的Cookie信息,继续发送一个HTTP请求加载验证码图片。和账号密码输入框一样,验证码输入框也对应一个<input>元素,因此用户输入的验证码会成为表单数据的一部分,表单提交后由网站服务器程序验证。

为何有验证码

什么是图片验证码?

  • 验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。

验证码的作用

  • 防止恶意破解密码、刷票、论坛灌水、刷页。有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登录尝试,实际上使用验证码是现在很多网站通行的方式(比如招商银行的网上个人银行,百度社区),我们利用比较简易的方式实现了这个功能。虽然登录麻烦一点,但是对网友的密码安全来说这个功能还是很有必要,也很重要。

图片验证码使用场景

  • 注册
  • 登录
  • 频繁发送请求时,服务器弹出验证码进行验证

图片验证码的处理方案

  • 手动输入(input) 这种方法仅限于登录一次就可持续使用的情况
  • 图像识别引擎解析 使用光学识别引擎处理图片中的数据,目前常用于图片数据提取,较少用于验证码处理
  • 打码平台 爬虫常用的验证码解决方案

1. OCR识别

OCR(Optical Character Recognition)是指使用扫描仪或数码相机对文本资料进行扫描成图像文件,然后对图像文件进行分析处理,自动识别获取文字信息及版面信息的软件。

在读取和处理图像、图像相关的机器学习以及创建图像等任务中,Python 一直都是非常出色的语言。虽然有很多库可以进行图像处理,但在这里我们只重点介绍:Tesseract

Tesseract 是一个 OCR 库,目前由 Google 赞助(Google 也是一家以 OCR 和机器学习技术闻名于世的公司)。Tesseract 是目前公认最优秀、最精确的开源 OCR 系统,除了极高的精确度,Tesseract 也具有很高的灵活性。它可以通过训练识别出任何字体,也可以识别出任何 Unicode 字符。

2.1 Tesseract

2.1.1 引擎的安装

  • mac环境

    brew install --with-training-tools tesseract
    
  • windows环境

    下的安装可以通过exe安装包安装,下载地址可以从GitHub项目中的wiki找到。安装完成后记得将Tesseract 执行文件的目录加入到PATH中,方便后续调用。

    • 下载可执行安装文件 https://github.com/UB-Mannheim/tesseract/wiki
  • linux环境下的安装

    sudo apt-get install tesseract-ocr

2.1.2 Python库的安装

# PIL用于打开图片文件
pip install pillow# pytesseract模块用于从图片中解析数据
pip install pytesseract

2.2 引擎的使用

通过pytesseract模块的 image_to_string 方法就能将打开的图片文件中的数据提取成字符串数据,具体方法如下

from PIL import Image
import pytesseract
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'  # 指定安装软件的位置im = Image.open()result = pytesseract.image_to_string(im)print(result)

二值化:

def binarizing(img, threshold):"""传入image对象进行灰度、二值处理"""img = img.convert("L")  # 转灰度pixdata = img.load()w, h = img.size# 遍历所有像素,大于阈值的为黑色for y in range(h):for x in range(w):if pixdata[x, y] < threshold:pixdata[x, y] = 0else:pixdata[x, y] = 255return img

降噪:

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

二值化:http://www.imcta.cn/zhuce_gerenhuiyuan_userzhuce.jsp

二值化+降噪: http://i.djye.com/user?a=register

参考:https://mlog.club/article/26903

2. 百度开发者平台

https://ai.baidu.com/ai-doc/OCR/Ek3h7xypm

在爬取网站的时候都遇到过验证码,那么我们有什么方法让程序自动的识别验证码呢?其实网上已有很多打码平台,但是这些都是需要money。但对于仅仅爬取点数据而接入打码平台实属浪费。所以百度免费ocr正好可以利用。(每天500次免费)

1、注册百度账号、百度云管理中心创建应用、生成AppKey、SecretKey(程序调用接口是要生成access_token)

2、利用AppKey、SecretKey生成access_token
向授权服务地址https://aip.baidubce.com/oauth/2.0/token发送请求(推荐使用POST)并在URL中带上以下参数:
grant_type: 必须参数,固定为client_credentials;
client_id: 必须参数,应用的API Key;
client_secret: 必须参数,应用的Secret Key

from aip import AipOcr# 你的 APPID AK SK
APP_ID = '你的 App ID'
API_KEY = '你的 Api Key'
SECRET_KEY = '你的 Secret Key'client = AipOcr(APP_ID, API_KEY, SECRET_KEY)# 读取图片
def get_file_content(filePath):with open(filePath, 'rb') as fp:return fp.read()# 测试文件也可以写路径
image = get_file_content('images/depoint.jpg')# 定义参数变量
options = {# 定义图像方向'detect_direction': 'true',# 识别语言类型,'CHN_ENG' 中英文混合'language_type': 'CHN_ENG',
}# 调用通用文字识别接口
results = client.basicGeneral(image, options)
print(results)
# 遍历取出图片解析的内容
# for word in result['words_result']:
#     print(word['words'])
try:code = results['words_result'][0]['words']
except:code = '验证码匹配失败'
print(code)

3. 打码平台

现在很多网站都会使用验证码来进行反爬,所以为了能够更好的获取数据,需要了解如何使用打码平台爬虫中的验证码

斐斐打码:http://www.fateadm.com/

4. 人工识别

最后讲解的方法听起来似乎很笨:人工识别。通常网站只需登录一次便可爬取,在其他识别方式不管用时,人工识别一次验证码也是可行的,其实现也非常简单——在下载完验证码图片后,调用Image.show方法将图片显示出来,然后调用Python内置的input函数,等待用户肉眼识别后输入识别结果。

附录:

tesseract 问题处理

错误: pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it’s not in your path

解决方法

找到源码中 tesseract_cmd = 'tesseract' 修改为 tesseract_cmd = r'D:\Program Files (x86)\Tesseract-OCR\tesseract.exe'

参考

Python 利用百度文字识别 API 识别并提取图片中文字:https://blog.csdn.net/XnCSD/article/details/80786793

利用百度API实现文字识别:https://blog.csdn.net/JBlock/article/details/79317878

训练好的字体模型: https://github.com/tesseract-ocr/tessdata

登录案例:https://so.gushiwen.org

百度api使用教程:https://blog.csdn.net/zico_a/article/details/103063330

百度api官方文档: https://cloud.baidu.com/doc/OCR/s/zk3h7xz52

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/285160.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java源码解析 - Iterator

定义 Iterator是一个泛型接口&#xff0c;里面分别定义了四个方法 boolean hasNext();E next();default void remove();default void forEachRemaining(Consumer<? super E> action); 其中hashNext()和next()方法在集合中经常用到&#xff0c;其在ArrayList中的实现如…

网络编程『socket套接字 ‖ 简易UDP网络程序』

&#x1f52d;个人主页&#xff1a; 北 海 &#x1f6dc;所属专栏&#xff1a; Linux学习之旅、神奇的网络世界 &#x1f4bb;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f324;️前言&#x1f326;️正文1.预备知识1.1.IP地址1.2.端口号1.3.端口号与进…

JVM 垃圾回收详解

前言 什么是垃圾? 垃圾是指运行程序中没有任何引用指向的对象&#xff0c;需要被回收。 内存溢出和内存泄漏 内存溢出&#xff1a;经过垃圾回收之后&#xff0c;内存仍旧无法存储新创建的对象&#xff0c;内存不够溢出。 内存泄漏&#xff1a;又叫“存储泄漏”&#xff0…

换热站数字孪生 | 图扑智慧供热 3D 可视化

换热站作为供热系统不可或缺的一部分&#xff0c;其能源消耗对城市环保至关重要。在双碳目标下&#xff0c;供热企业可通过搭建智慧供热系统&#xff0c;实现供热方式的低碳、高效、智能化&#xff0c;从而减少碳排放和能源浪费。通过应用物联网、大数据等高新技术&#xff0c;…

AXure的情景交互

目录 导语&#xff1a; 1.erp多样性登录界面 2.主页跳转 3.省级联动​编辑 4. 下拉加载 导语&#xff1a; Axure是一种流行的原型设计工具&#xff0c;可以用来创建网站和应用程序的交互原型。通过Axure&#xff0c;设计师可以创建情景交互&#xff0c;以展示用户与系统的交…

Golang 清晰代码指南 2

发挥可读性和可维护性软件的好处 - 第二部分 在编程复杂的世界中&#xff0c;函数是构建代码大厦的基石。在本文中&#xff0c;我们踏上了一段旅程&#xff0c;探索设计简洁、连贯且高度实用的函数的艺术。 函数&#xff1a;代码的基石 想象函数就像是熟练的工匠&#xff0c…

后端相关随机题目记录(1)

目录 后端相关随机题目记录&#xff08;1&#xff09; 后端相关随机题目记录&#xff08;1&#xff09;Bean的类型以及作用域Bean的生命周期Mysql的底层数据结构RedisHttp和Https区别AOP在项目的应用 自定义注解&#xff1f;请求在spring中的一个流程Nacos与zk的区别SpringMV…

[23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians

[paper | proj] 给定FLAME&#xff0c;基于每个三角面片中心初始化一个3D Gaussian&#xff08;3DGS&#xff09;&#xff1b;当FLAME mesh被驱动时&#xff0c;3DGS根据它的父亲三角面片&#xff0c;做平移、旋转和缩放变化&#xff1b;3DGS可以视作mesh上的辐射场&#xff1…

0基础学习VR全景平台篇第129篇:认识单反相机和鱼眼镜头

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 一、相机 单反和微单 这里说的相机是指可更换镜头的单反/微单数码相机。那两者有何差异呢&#xff1f; 1&#xff09;取景结构差异 两者最直观的区别在于&#xff0c;微单相机…

Android 11.0 framework关于systemUI定制之导航栏透明背景的功能实现

1.概述 在11.0的系统rom产品定制化开发中,在对于系统原生SystemUI的导航栏背景在沉浸式导航栏的 情况下默认是会随着背景颜色的变化而改变的,在一些特定背景下导航栏的背景也是会改变的,所以由于产品开发需要 要求需要设置导航栏背景为透明的,所以就需要在Activity创建的时…

C++共享和保护——(4)保护共享数据

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 一滴汗珠万粒粮&#xff0c;万粒汗珠谷…

探索人工智能中的语言模型:原理、应用与未来发展

导言 语言模型在人工智能领域中扮演着重要的角色&#xff0c;它不仅是自然语言处理的基础&#xff0c;也是许多智能系统的核心。本文将深入研究语言模型的原理、广泛应用以及未来发展趋势。 1. 语言模型的原理 统计语言模型&#xff1a; 基于概率统计的传统语言模型&…