Python requests 网页模拟登录 自动读取验证码

156 篇文章 0 订阅
92 篇文章 0 订阅

网页验证码,即“网络全自动区分计算机和人类的图灵测试”(Completely Automated Public Turing test to tell Computers and Humans Apart, CAPTCHA),是一种用于网站安全的常见措施。它的主要目的是区分真实用户和自动化程序(如爬虫),以防止恶意软件滥用或执行自动化操作。验证码的形式多样,包括文字、数字、图形或其组合,其中以四位英文和数字组合的验证码最为普遍。在网络爬虫技术中,验证码识别代表着一项重大挑战,因为其设计初衷就是要抵抗自动化工具的识别和解析。

基本类型

  1. 文本验证码:显示随机生成的字母和数字组合。这些字符可能被扭曲、旋转或以不同颜色显示,以防止自动化工具识别。

  2. 图像验证码:要求用户识别图片中的特定对象,如交通标志、车辆、店铺等。

  3. 逻辑验证码:提出简单问题或谜题,例如数学问题、字谜或智力问题。

  4. 行为验证:分析用户的行为特征,如鼠标移动、滚动或点击模式,判断用户是否为真实人类。

  5. No CAPTCHA reCAPTCHA:Google 开发的一种验证码,用户只需勾选“我不是机器人”复选框,系统会自动进行风险分析。

Google 的 CAPTCHA 是一种广泛使用的验证码服务,被称为 reCAPTCHA。它是为了提高网站的安全性和用户体验而设计的,旨在区分人类用户和自动化程序(如网络爬虫)。Google 的 reCAPTCHA 经历了几代的发展,每一代都带来了新的特点和改进。

reCAPTCHA 的几个主要版本:

  1. reCAPTCHA v1

  • 最初的版本,展示了扭曲的文字,并要求用户输入这些文字以证明他们不是机器人。

  • 由于易读性问题和自动化技术的进步,这个版本已被淘汰。

  1. reCAPTCHA v2

  • “我不是机器人”复选框(No CAPTCHA reCAPTCHA):用户只需勾选一个复选框即可完成验证。系统会根据用户的行为和环境变量自动进行风险评估。

  • 图像挑战:如果系统怀疑用户可能不是人类,它会提出一个图像识别的挑战,要求用户从一系列图片中选择符合特定标准的图片。

  1. reCAPTCHA v3

  • 这个版本完全不同于以往,它运行在背景中,对用户行为进行实时分析,以给出一个分数表示用户的可能性是人类还是机器人。

  • 网站管理员可以根据这个分数来决定是否采取进一步的行动,如提出挑战或阻止访问。

Google 的 reCAPTCHA 是目前最流行的验证码解决方案之一,它平衡了安全性和用户体验,被广泛应用于各种网站上,以防止自动化的滥用和攻击。

爬虫验证码识别的挑战

  1. 图像噪点和扭曲:为了防止自动识别,验证码图片通常会加入噪点、背景线、扭曲或颜色变化等。

  2. 文字样式多样性:验证码中的字体、大小、风格可能变化多端,增加了识别难度。

  3. 动态更新:许多网站的验证码在每次请求时都会改变,要求爬虫能实时有效地处理新验证码。

实现方式

一般来说,验证码的自动识别涉及图像处理和光学字符识别(OCR)技术。以下是一个简单的使用 Python requests 库和 pytesseract 库(Tesseract OCR 的 Python 接口)进行验证码识别的例子:

  1. 安装必要的库

    pip install requests
    pip install pillow  # 用于图像处理
    pip install pytesseract  # Tesseract OCR 的 Python 接口
    
  2. 下载并安装 Tesseract OCR

    • Tesseract GitHub 上有安装说明。

  3. 示例代码

    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>&nbsp;<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%免费】在这里插入图片描述
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值