Python反爬机制-验证码(一)

简介: Python反爬机制-验证码(一)

识别验证码
OCR(Optical Character Recognition)即光学字符识别技术,专门用于对图片文字进行识别,并获取文本。字符验证码的特点就是验证码中包含数字、字母或者掺杂着斑点与混淆曲线的图片验证码。识别此类验证码,首先需要找到验证码验证码图片在网页HTML代码中的位置,然后将验证码下载,最后再通过OCR技术进行验证码的识别工作。

  1. 字符验证码
    1.1 OCR环境
    Tesseract-OCR是一个免费、开源的OCR引擎,通过该引擎可以识别图片中的验证码,搭建OCR的具体步骤如下:

(1)这里以macOS操作系统为例,使用brew install安装tesseract,命令如下:

liuxiaowei@MacBookAir ~ % brew install --with-training-tools tesseract    # 同时安装附加组件

安装完毕后用如下命令测试,示例代码如下:

liuxiaowei@MacBookAir ~ % tesseract -v
tesseract 5.0.1
 leptonica-1.82.0
  libgif 5.2.1 : libjpeg 9d : libpng 1.6.37 : libtiff 4.3.0 : zlib 1.2.11 : libwebp 1.2.1 : libopenjp2 2.4.0
 Found AVX2
 Found AVX
 Found FMA
 Found SSE4.1
 Found libarchive 3.5.2 zlib/1.2.11 liblzma/5.2.5 bz2lib/1.0.8 liblz4/1.9.3 libzstd/1.5.0
 Found libcurl/7.77.0 SecureTransport (LibreSSL/2.8.3) zlib/1.2.11 nghttp2/1.42.0

(2)安装tesseract模块,安装命令如下:

pip install tesseract

说 明

如果使用的的是Anaconda并在安装tesseract模块时出现错误,可以使用如下命令:

conda install -c simonflueckiger tesseract

1.2 下载验证码图片
以下面地址对应的网页为例,下载网页中的验证码图片,具体步骤如下:

测试页面地址:http://sck.rjkflm.com:666/spider/word/

(1)使用浏览器打开测试网页的地址,将显示如下图片所示的字符验证码:

image.png

(2)打开浏览器开发者工具,然后在HTML代码中获取验证码图片所在的位置,如下图所示:
image.png
image.png

(3) 对目标网页发送网络请求,并在返回的HTML代码中获取图片的下载地址,然后下载验证码图片。代码如下:

#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 创建时间   :2/15/22 7:47 PM
# 文件      :获取HTML代码中地址下载验证码图片.py
# IDE      :PyCharm

# 导入网络请求模块
import requests
# 导入urllib.request模块
import urllib.request
# 导入随机请求头
from fake_useragent import UserAgent

# 导入ssl,否则ssl验证错误
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
# 导入解析HTML的模块
from bs4 import BeautifulSoup
# 创建随机请求头
header = {
   'User-Agent':UserAgent().random}
# 网页请求地址
url = 'http://sck.rjkflm.com:666/spider/word/'
# 发送网络请求
resp = requests.get(url, header)
resp.encoding = 'utf-8'

# 解析HTML
html = BeautifulSoup(resp.text, 'html.parser')
src = html.find('img').get('src')
# 组合验证码图片请求地址
img_url = url+src
# 下载并设置图片名称
urllib.request.urlretrieve(img_url, 'code.png')

程序运行后项目文件夹中自动生成验证码图片,结果如下图:

image.png

1.3 识别验证码
验证码下载完成以后, 如果没有安装pillow模块,需要通过“pip install pillow“命令安装一下,如果tesserocr模块没安装也要通过"pip install tesserocr"先安装,然后导入tesserocr与Image模块,再通过Image.open()方法打开验证码图片,接着通过tesserocr.image_to_text()函数识别图片中的验证码信息即可。示例代码如下:

#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 创建时间   :2/16/22 7:21 AM
# 文件      :识别图中验证码.py
# IDE      :PyCharm

# 导入tesserocr模块
import  tesserocr
# 导入图像处理模块
from PIL import Image
# 打开验证码图片
img = Image.open('code.png')
# 将图片中的验证码转换为文本
code = tesserocr.image_to_text(img)

print('验证码为: ', code)

程序运行结果如下:

验证码为:  uuuc


Process finished with exit code 0

OCR的识别技术虽然很强大,但是并不是所有的验证码都可以这么轻松地识别出来,如下图所示的验证码中就会掺杂很多干扰线条,那么在识别这样的验证码信息时,就需要对验证码图片进行相应的处理并识别。

如果直接通过OCR识别,识别结果将会受到干扰线的影响,下面通过OCR直接识别测试一下效果。示例代码如下:

#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 创建时间   :2/16/22 8:23 AM
# 文件      :识别带干扰线的验证码.py
# IDE      :PyCharm

import tesserocr        # 导入tesserocr模块
from PIL import Image   # 导入图像处理模块
img =Image.open('code2.jpg')   # 打开验证码图片
img = img.convert('L')         # 将彩色图片转换为灰度图片
img.show()                     # 显示灰度图片
code = tesserocr.image_to_text(img)        # 将图片中的验证码转换为文本
print('验证码为:',code)

程序运行结果如下:

验证码为: YSGN.       # 多了一个.

Process finished with exit code 0

通过以上测试发现,直接通过OCR技术识别后的验证码中多了一个‘.’,遇到此类情况手写可以将彩色的验证码图片转为灰度图片在测试一下。示例代码如下:

#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 创建时间   :2/16/22 8:29 AM
# 文件      :将彩色验证码图片转为灰度图片测试.py
# IDE      :PyCharm

import tesserocr        # 导入tesserocr模块
from PIL import Image   # 导入图像处理模块
img =Image.open('code2.jpg')   # 打开验证码图片
img = img.convert('L')         # 将彩色图片转换为灰度图片
img.show()                     # 显示灰度图片
code = tesserocr.image_to_text(img)        # 将图片中的验证码转换为文本
print('验证码为:',code)

程序运行结果如下:

验证码为: YSGN.  # 依然多一个‘.‘
Process finished with exit code 0

image.png

接下来需要将转为灰度的验证码图片进行二值化处理,将验证码二值化处理后再次通过OCR进行识别。示例代码如下:

#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 创建时间   :2/16/22 8:38 AM
# 文件      :将验证码图片二值化处理.py
# IDE      :PyCharm

import tesserocr        # 导入tesserocr模块
from PIL import Image   # 导入图像处理模块
img =Image.open('code2.jpg')   # 打开验证码图片
img = img.convert('L')         # 将彩色图片转换为灰度图片
t = 155                        # 设置阀值
table = []                     # 二值化数据的列表
for i in range(256):          # 循环遍历
    if i <t:
        table.append(0)
    else:
        table.append(1)
img = img.point(table,'1')     # 将图片进行二值化处理
img.show()                     # 显示处理后图片
code = tesserocr.image_to_text(img)   # 将图片中的验证码转换为文本
print('验证码为:',code)              # 打印验证码

程序运行后将自动显示二值化处理后的验证码图片
image.png

程序运行结果如下:

验证码为: YSGN
Process finished with exit code 0

说 明

在识别以上具有干扰线的验证码图片时,我们可以做一些灰度和二值化处理,这样可以提高图片的验证码的识别度,如果二值化处理后还是无法识别到精确性,可以适当的上下调节二值化操作的阙值。

接下文 Python反爬机制-验证码(二)https://developer.aliyun.com/article/1617994

相关文章
|
6月前
|
机器学习/深度学习 数据采集 API
Python自动化解决滑块验证码的最佳实践
Python自动化解决滑块验证码的最佳实践
|
4月前
|
测试技术 Python
Python测试报告生成:整合错误截图,重复用例执行策略,调整测试顺序及多断言机制。
如何组织这一切呢?你可以写一本名为“Python测试之道”的动作指南手册,或者创建一个包含测试策略、测试顺序、多断言机制的脚本库。只要你的测试剧本编写得足够独到,你的框架就会像一位执行任务的超级英雄,将任何潜伏于代码深处的错误无情地揪出来展现在光天化日之下。这些整理好的测试结果,不仅有利于团队协作,更像冒险故事中的精彩篇章,带给读者无尽的探索乐趣和深刻的思考。
118 10
|
6月前
|
数据采集 Web App开发 文字识别
Python爬虫多次请求后被要求验证码的应对策略
Python爬虫多次请求后被要求验证码的应对策略
|
7月前
|
人工智能 算法 数据安全/隐私保护
[oeasy]python080如何生成验证码_随机数字密码_真随机
本文介绍了如何生成随机验证码的过程,从简单的随机数字生成到包含数字、大小写字母及符号的复杂验证码。通过 Python 的 `random` 和 `string` 模块,逐步扩展字符集并确保结果满足特定要求(如包含各类字符)。同时探讨了随机数生成的本质,指出计算机中的“随机”实际上是基于算法和种子值的伪随机,并非真正的物理随机。最后总结了验证码的生成原理及其在实际应用中的意义,为读者揭开日常生活中验证码背后的编程逻辑。
248 8
|
9月前
|
并行计算 安全 Java
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
在Python开发中,GIL(全局解释器锁)一直备受关注。本文基于CPython解释器,探讨GIL的技术本质及其对程序性能的影响。GIL确保同一时刻只有一个线程执行代码,以保护内存管理的安全性,但也限制了多线程并行计算的效率。文章分析了GIL的必要性、局限性,并介绍了多进程、异步编程等替代方案。尽管Python 3.13计划移除GIL,但该特性至少要到2028年才会默认禁用,因此理解GIL仍至关重要。
586 16
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
|
7月前
|
缓存 安全 Android开发
Python实战:搭建短信转发器,实现验证码自动接收与处理
在移动互联网时代,短信验证码是重要的安全手段,但手动输入效率低且易出错。本文介绍如何用Python搭建短信转发器,实现验证码自动接收、识别与转发。通过ADB工具监听短信、正则表达式或ddddocr库提取验证码,并利用Flask框架转发数据。系统支持多设备运行,具备安全性与性能优化功能,适合自动化需求场景。未来可扩展更多功能,提升智能化水平。
755 1
|
9月前
|
缓存 JSON 数据处理
Python进阶:深入理解import机制与importlib的妙用
本文深入解析了Python的`import`机制及其背后的原理,涵盖基本用法、模块缓存、导入搜索路径和导入钩子等内容。通过理解这些机制,开发者可以优化模块加载速度并确保代码的一致性。文章还介绍了`importlib`的强大功能,如动态模块导入、实现插件系统及重新加载模块,展示了如何利用这些特性编写更加灵活和高效的代码。掌握这些知识有助于提升编程技能,充分利用Python的强大功能。
440 4
|
11月前
|
UED 开发者 Python
Python中的异常处理机制
Python中的异常处理机制
148 2
|
11月前
|
监控 Java 开发者
Python的垃圾收集机制有哪些?
Python的垃圾收集机制有哪些?
|
数据采集 自然语言处理 API
Python反爬案例——验证码的识别
Python反爬案例——验证码的识别
291 2

推荐镜像

更多