网页验证码,即“网络全自动区分计算机和人类的图灵测试”(Completely Automated Public Turing test to tell Computers and Humans Apart, CAPTCHA),是一种用于网站安全的常见措施。它的主要目的是区分真实用户和自动化程序(如爬虫),以防止恶意软件滥用或执行自动化操作。验证码的形式多样,包括文字、数字、图形或其组合,其中以四位英文和数字组合的验证码最为普遍。在网络爬虫技术中,验证码识别代表着一项重大挑战,因为其设计初衷就是要抵抗自动化工具的识别和解析。
基本类型
-
文本验证码:显示随机生成的字母和数字组合。这些字符可能被扭曲、旋转或以不同颜色显示,以防止自动化工具识别。
-
图像验证码:要求用户识别图片中的特定对象,如交通标志、车辆、店铺等。
-
逻辑验证码:提出简单问题或谜题,例如数学问题、字谜或智力问题。
-
行为验证:分析用户的行为特征,如鼠标移动、滚动或点击模式,判断用户是否为真实人类。
-
No CAPTCHA reCAPTCHA:Google 开发的一种验证码,用户只需勾选“我不是机器人”复选框,系统会自动进行风险分析。
Google 的 CAPTCHA 是一种广泛使用的验证码服务,被称为 reCAPTCHA。它是为了提高网站的安全性和用户体验而设计的,旨在区分人类用户和自动化程序(如网络爬虫)。Google 的 reCAPTCHA 经历了几代的发展,每一代都带来了新的特点和改进。
reCAPTCHA 的几个主要版本:
reCAPTCHA v1:
最初的版本,展示了扭曲的文字,并要求用户输入这些文字以证明他们不是机器人。
由于易读性问题和自动化技术的进步,这个版本已被淘汰。
reCAPTCHA v2:
“我不是机器人”复选框(No CAPTCHA reCAPTCHA):用户只需勾选一个复选框即可完成验证。系统会根据用户的行为和环境变量自动进行风险评估。
图像挑战:如果系统怀疑用户可能不是人类,它会提出一个图像识别的挑战,要求用户从一系列图片中选择符合特定标准的图片。
reCAPTCHA v3:
这个版本完全不同于以往,它运行在背景中,对用户行为进行实时分析,以给出一个分数表示用户的可能性是人类还是机器人。
网站管理员可以根据这个分数来决定是否采取进一步的行动,如提出挑战或阻止访问。
Google 的 reCAPTCHA 是目前最流行的验证码解决方案之一,它平衡了安全性和用户体验,被广泛应用于各种网站上,以防止自动化的滥用和攻击。
爬虫验证码识别的挑战
-
图像噪点和扭曲:为了防止自动识别,验证码图片通常会加入噪点、背景线、扭曲或颜色变化等。
-
文字样式多样性:验证码中的字体、大小、风格可能变化多端,增加了识别难度。
-
动态更新:许多网站的验证码在每次请求时都会改变,要求爬虫能实时有效地处理新验证码。
实现方式
一般来说,验证码的自动识别涉及图像处理和光学字符识别(OCR)技术。以下是一个简单的使用 Python requests
库和 pytesseract
库(Tesseract OCR 的 Python 接口)进行验证码识别的例子:
-
安装必要的库:
pip install requests pip install pillow # 用于图像处理 pip install pytesseract # Tesseract OCR 的 Python 接口
-
下载并安装 Tesseract OCR:
-
Tesseract GitHub 上有安装说明。
-
-
示例代码:
import requests from PIL import Image import pytesseract from io import BytesIO # 请求验证码图片 url = 'http://example.com/captcha.jpg' # 假设这是验证码的URL response = requests.get(url) image = Image.open(BytesIO(response.content)) # OCR 识别验证码 captcha_text = pytesseract.image_to_string(image) print(f"识别出的验证码是: {captcha_text}")
注意事项
-
图像预处理:为提高识别率,可能需要对图像进行灰度转换、二值化、去噪等预处理。
-
准确性问题:OCR 识别准确性受到多种因素影响,可能需要针对具体的验证码类型进行调优。
-
法律和道德考量:在进行网络爬虫和验证码识别时,务必遵守相关网站的服务条款,尊重数据使用规范和隐私政策。
验证码识别是一个复杂的问题,对于一些特别设计来防止自动化读取的验证码,使用标准OCR工具可能效果不佳。在这种情况下,可能需要更高级的图像处理技术,甚至是机器学习方法来提高识别率。
简单实例
有一个简单登录界面,带有验证码
现在需要自动登录,读取和识别这个4位字母数据的验证码。这个表单的代码为:
<form name="form1" method="post" action="">
<fieldset class="form">
<p>
<label class="loginlabel" for="user_name">
用户名:</label>
<input class="logininput ui-keyboard-input ui-widget-content ui-corner-all" name="user_name"
id="user_name" type="text" value="" />
</p>
<p>
<label class="loginlabel" for="user_password">
密码:</label>
<span>
<input class="logininput" name="user_password" id="user_password" type="password" value=""/></span>
</p>
<p>
<label class="loginlabel" for="yzm">
验证码:</label>
<span>
<input class="logininput ui-keyboard-input ui-widget-content ui-corner-all" style="width:50px;" name="yzm" id="yzm" type="text" value="" onkeydown='keydownlogin(this.form,event)'/>
</span>
<span><img src="/DZQZ/pictureCheckCode" id="pictureCheckCode" title="不区分大小写" style="height:26px;vertical-align:middle;"/></span>
<span> <a href="javascript:myReload()" style="font-size: 12px;">看不清?换一个</a></span>
</p>
<button id="loginbtn" type="button" class="positive" name="Submit">
<img src="/DZQZ/global/images/key.png"/>登录</button>
<ul id="forgottenpassword" style="display:none">
<li class="boldtext"></li>
<li>
<a href="#">忘记密码</a>
</li>
</ul>
</fieldset>
</form>
验证码的位置在<img src="/DZQZ/pictureCheckCode"
,通过requests.get(URL)获取html文件,解析代码,读取这个图片,保存到本地。
session = requests.Session()
headers = {
#'Content-Type': 'application/x-www-form-urlencoded'
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'Accept-Encoding':'gzip, deflate',
'Accept-Language':'zh-CN,zh;q=0.9',
'Connection':'keep-alive',
'Referer':'http://example.com/DZQZ/index.htm',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'
}
# 发送GET请求获取登录页面
login_page_url = 'http://example.com/DZQZ/login.htm'
response = session.get(login_page_url,headers=headers)
# 获取当前时间的时间戳
timestamp = time.time()
# 将时间戳转换为字符串
captcha_jpg = str(timestamp)+'.jpg'
# 保存图片
with open(captcha_jpg, 'wb') as f:
f.write(img_response.content)
得到验证码的图片后,通过pytesseract
来识别这个验证码,pytesseract
来识别文字的前提条件,文字和背景区别比较明显,简单的实现过程上面已经介绍了,直接用PIL读取图片, text = pytesseract.image_to_string(Image.open('test.jpg'), lang='eng')
来识别图片,返回结果。测试阶段需要把图片显示出来。
from PIL import Image
img = Image.open('test.jpg')
img.show()
进行随时查看。pytesseract除了安装Python版本,还需要安装Windows版 tesseract-ocr-w64-setup-5.3.3.20231005.exe
,在pytesseract中配置其安装路径。
img = Image.open(captcha_jpg)
#img.show()
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
text = pytesseract.image_to_string(Image.open(captcha_jpg), lang='eng')
#print(text.replace(' ', ''))
captcha = text.replace(' ', '').replace("\n", "")
得到验证码的结果中可能存空格和回国,通过替换都去除。通过以上几步,就拿到最简单的验证码。
行动吧,在路上总比一直观望的要好,未来的你肯定会感谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入群: 786229024,里面有各种测试开发资料和技术可以一起交流哦。
最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。