自动化验证码破解:Python与OCR库的完美结合

本文介绍了如何使用Playwright库配合ddddocr进行网页自动化,包括验证码识别和滑动验证的实现,展示了如何通过深度学习的OCR技术解决登录过程中的验证码问题,以及如何通过滑动匹配功能应对滑动验证。
摘要由CSDN通过智能技术生成

本文主要简单讲解通过playwright与ddddocr结合来解决自动化需要验证的一些方法,主要包括普通验证码、滑动验证。

1、ddddocr

ddddocr的特点主要包括:

  1. 高准确率:利用深度学习技术,特别是卷积神经网络和循环神经网络,对双重数字进行准确的识别。通过深度学习的方法,ddddocr在双重数字识别任务上能够取得较高的准确率。

  2. 开源项目:这是一个开源项目,允许用户免费使用、修改和分发代码。这使得更多的开发者可以参与其中,贡献自己的想法和改进。

  3. 灵活性:用户可以根据自己的需求自定义模型并进行训练,以适应不同的双重数字识别任务。

  4. 全面覆盖:作为一款全面覆盖的OCR识别工具,则在识别能力方面表现出了非常出色的性能。在识别中文方面,ddddocr能够准确识别包括繁体字在内各种中文汉字,甚至还支持一些生僻字的识别。而在识别英文时,则能够准确辨别各种大小写字母、数字、基本符号等英文字符。此外,ddddocr还支持各种印刷体和手写体的识别,可以满足不同用户的多种识别需求。

  5. 优秀的使用体验:用户只需要选择需要识别的文件,并点击一键识别,即可非常方便地完成整个识别流程。此外,ddddocr还支持多种语言的识别,用户可以根据自己的使用需求选择适合的语言进行识别。

ddddocr的使用教程

图片:

安装

pip install ddddocr

使用ddddocr识别验证码图片示例

import ddddocr  
ocr = ddddocr.DdddOcr()  
with open('img.png','rb') as img:  
    img\_bytes = img.read()  
res = ocr.classification(img\_bytes)  
print(res)

使用总结:相当简单,相当精准,优先推荐!!!

这里有广告,可以在实例化传入参数show_ad=False,就没有广告了

2、playwright截取验证码并识别实现登录

开始录制脚本获取元素定位

 python \-m playwright codegen \-o "D:\\PythonProject\\OCR-project\\qb5.py"

录制完成后手动编辑修改一下

from playwright.sync\_api import Playwright, sync\_playwright, expect  
import ddddocr  
import time  
\# 定义识别验证码的方法  
def checkcode(path):  
    ocr = ddddocr.DdddOcr(show\_ad\=False)  
    with open(path,'rb') as img:  
        img\_bytes = img.read()  
    res = ocr.classification(img\_bytes)  
    return res  
\# 登录  
def login\_by\_checkcode(playwright):  
    browser = playwright.chromium.launch(headless\=False)  
    context = browser.new\_context()  
    page = context.new\_page()  
    page.goto("https://example.com")  
    page.locator("#username").fill("your username")  
    page.locator("#password").fill("your password")  
    \# 通过元素截屏  
    element\_handle = page.get\_by\_role("img")  
    element\_handle.screenshot(path\='screenshot.png')  
    \# 调用函数,获取验证码  
    check\_code = checkcode(path\='screenshot.png')  
    print(check\_code)  
    page.locator("input\[name=\\"checkcode\\"\]").fill(check\_code)  
    page.get\_by\_role("checkbox").uncheck()  
    page.get\_by\_role("button", name\="立即登录").click()  
    time.sleep(5)  
    context.close()  
    browser.close()  
      
with sync\_playwright() as playwright:  
    login\_by\_checkcode(playwright)

3、playwright实现滑动验证登录

测试网站:https://www.geetest.com/adaptive-captcha-demo

开始录制脚本

python38 \-m playwright codegen \-o "D:\\PythonProject\\OCR-project\\ocr\_slide.py"
\# coding:utf-8  
\# @author:Achen\_blog  
import requests  
from playwright.sync\_api import Playwright, sync\_playwright, expect  
import re  
import ddddocr  
import time  
import requests  
from lxml import etree  
\# 通过ddddocr获取需要滑动的的位移  
def get\_xy():  
    det = ddddocr.DdddOcr(det\=False, ocr\=False, show\_ad\=False)  
  
    with open('slice.png', 'rb') as f:  
        target\_bytes = f.read()  
  
        f.close()  
    with open('background.png', 'rb') as f:  
        background\_bytes = f.read()  
  
        f.close()  
    try:  
        res = det.slide\_match(target\_bytes, background\_bytes,simple\_target\=True)  
        print(res)  
        return res.get('target')\[0\]  
    except:  
        return False  
  
def slide\_ocr(playwright):  
    browser = playwright.chromium.launch(headless\=False)  
    context = browser.new\_context()  
    \# 需要设置网页视图大小  
    page = context.new\_page()  
    page.goto("https://www.geetest.com/adaptive-captcha-demo")  
    page.locator("div").filter(has\_text\=re.compile(r"^滑动拼图验证$")).click()  
    page.get\_by\_label("点击按钮开始验证").click()  
    \# 获取滑动图片  
    time.sleep(3)  
    lxml = page.content() \# 由于获取滑动图片元素定位复杂,这里改用lxmlxpath定位  
    html = etree.HTML(lxml)  
    \# time.sleep(10)  
    slice\_link = html.xpath('//\*\[@id="captcha"\]/div\[2\]/div\[1\]/div\[4\]/div\[1\]/div\[2\]/div/div/div\[1\]/div\[1\]/div\[1\]/@style')\[0\]  #这里的属性是列表  
    \# print(slice\_link)  
    slice\_link = str(slice\_link) #必须将获得属性值转为str,不然不能直接切割  
    slice\_url = slice\_link.split('"')\[1\]  
    print(slice\_url)  
    with open('slice.png','wb') as slice1:  
        pic1 = requests.get(slice\_url).content  
        time.sleep(1)  
        slice1.write(pic1)  
        slice1.close()  
    \# 获取背景图片  
    \# time.sleep(2)  
    bg\_url = html.xpath('//\*\[@id="captcha"\]/div\[2\]/div\[1\]/div\[4\]/div\[1\]/div\[2\]/div/div/div\[1\]/div\[2\]/@style')\[0\]  
    bg\_url = str(bg\_url)  
    bg\_url = bg\_url.split('"')\[1\]  
    print(bg\_url)  
    with open('background.png','wb') as bg1:  
        pic2 = requests.get(bg\_url).content  
        time.sleep(1)  
        bg1.write(pic2)  
        bg1.close()  
      
    \# 调用获取滑动位移的函数  
    target = get\_xy()  
    \# 如果target返回true,则通过鼠标移动滑块  
    print(target)  
    if target:  
        print(target)  
        class1 = html.xpath('//\*\[@id="captcha"\]/div\[2\]/div\[1\]/div\[4\]/div\[1\]/div\[2\]/div/div/div\[1\]/div\[1\]/div\[1\]/@class')\[0\]  
        class1 = str(class1)  
        str1 = class1.split(' ')\[0\].split('\_')\[0\]  
        str2 = class1.split(' ')\[0\].split('\_')\[1\]  
        str3 = class1.split(' ')\[0\].split('\_')\[3\]  
        clastr ='.' + str1 + '\_' + str2+ '\_' +str3  
        x0 = page.locator(clastr).bounding\_box()\['x'\]  
        y0 = page.locator(clastr).bounding\_box()\['y'\]  
        x = x0 + target +2  \# 坐标需自己进行微调  
        y = y0  
        page.locator(clastr).hover()#鼠标悬停  
        page.mouse.down()\# 鼠标落下  
        page.mouse.move(x,y) #鼠标移动  
        page.mouse.up() #松开鼠标  
        time.sleep(1)  
        try:  
            pas\_text = html.xpath('//\*\[@id="captcha"\]/div\[2\]/div\[1\]/div\[3\]/div\[2\]/div/div\[2\]/text()')  
  
            if pas\_text == '验证通过':  
                print('验证成功!')  
            else:  
                print('验证失败')  
        except:  
            print('验证失败')  
    \# page.locator("div").filter(has\_text=re.compile(r"^验证失败 请重新尝试$")).nth(1).click()  
    \# page.locator().bounding\_box()  
    \# ---------------------  
    context.close()  
    browser.close()  
  
  
with sync\_playwright() as playwright:  
    slide\_ocr(playwright)  

playwright的xpath绝对定位不好用,特别是包含角标的会失效,不建议使用下标

当面临必须要用绝对xpath而且有下表如div[2]等情况才能定位,那么建议转为lxml的xpath定位

工具没有完美的,playwright需要不断改进,但我们使用可以结合不同工具,比如定位这里可以用pyppteer

好了本次分享就到这,历经了点波折,还是不够完美,但是验证码识别思路已经搞定!

---------------------------END---------------------------

题外话

在这里插入图片描述

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。

👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述

👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

若有侵权,请联系删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值