本文主要简单讲解通过playwright与ddddocr结合来解决自动化需要验证的一些方法,主要包括普通验证码、滑动验证。
1、ddddocr
ddddocr的特点主要包括:
-
高准确率:利用深度学习技术,特别是卷积神经网络和循环神经网络,对双重数字进行准确的识别。通过深度学习的方法,ddddocr在双重数字识别任务上能够取得较高的准确率。
-
开源项目:这是一个开源项目,允许用户免费使用、修改和分发代码。这使得更多的开发者可以参与其中,贡献自己的想法和改进。
-
灵活性:用户可以根据自己的需求自定义模型并进行训练,以适应不同的双重数字识别任务。
-
全面覆盖:作为一款全面覆盖的OCR识别工具,则在识别能力方面表现出了非常出色的性能。在识别中文方面,ddddocr能够准确识别包括繁体字在内各种中文汉字,甚至还支持一些生僻字的识别。而在识别英文时,则能够准确辨别各种大小写字母、数字、基本符号等英文字符。此外,ddddocr还支持各种印刷体和手写体的识别,可以满足不同用户的多种识别需求。
-
优秀的使用体验:用户只需要选择需要识别的文件,并点击一键识别,即可非常方便地完成整个识别流程。此外,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
好了本次分享就到这,历经了点波折,还是不够完美,但是验证码识别思路已经搞定!
题外话
感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。
👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)
一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python必备开发工具
工具都帮大家整理好了,安装就可直接上手!
三、最新Python学习笔记
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、Python视频合集
观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
五、实战案例
纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
六、面试宝典
简历模板
👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)
若有侵权,请联系删除