ocr识别验证码selenium点击

该博客展示了如何使用Python的selenium库自动化登录B站,并利用ddddocr模块识别和处理登录过程中的验证码。首先,通过selenium打开并最大化浏览器窗口,输入账号和密码,然后截取验证码图片并进行裁剪。接着,使用ddddocr进行文字识别,分别处理点击部分和条件部分的验证码,最后通过ActionChains模拟鼠标点击完成登录。整个过程涉及网页自动化、图像处理和OCR技术。
摘要由CSDN通过智能技术生成

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# 一个文字识别模块
import ddddocr
from io import BytesIO
from PIL import Image
# 动作链方法
from selenium.webdriver import ActionChains
def kaishi():
    driver = webdriver.Chrome(r'./chromedriver.exe')
    driver.get(f"https://passport.bilibili.com/login?from_spm_id=333.337.top_bar.login_window")
    driver.maximize_window()

    # 账户密码定位
    driver.find_element(By.XPATH,'//*[@id="login-username"]').send_keys("1888888888888")
    driver.find_element(By.XPATH,'//*[@id="login-passwd"]').send_keys("456789798")
    # 点击登录
    driver.find_element(By.XPATH,'//*[@id="geetest-wrap"]/div/div[5]/a[1]').click()
    time.sleep(1)
    # 保存
    driver.save_screenshot("哔哩哔哩.png")
    # 对验证码进行裁剪 通过左上右下的顺序 进行裁剪
    new_img=Image.open("./哔哩哔哩.png")
    # 点击部分
    image_ws=new_img.crop((835,281,1093,539))
    # 条件部分
    image_ws1=new_img.crop((961,239,1090,276))
    # 对文件对象进行保存 保存验证码
    image_ws.save("imag1.png")
    image_ws1.save("imag2.png")
    det = ddddocr.DdddOcr(det=True)
    ocr = ddddocr.DdddOcr(show_ad=False)
    with open("imag1.png", 'rb') as f:
        image = f.read()
    # 提取'点击部分'的文字坐标
    poses = det.detection(image)
    print(poses)
    words = []
    for box in poses:
        print(box)
        # 根据遍历出的各文字坐标进行裁剪
        image_ws = new_img.crop((box))
        img_byte = BytesIO()
        # 转换成'classification()'需要的格式
        image_ws.save(img_byte,'png')
        # 将裁剪出的各个文字进行'提取'字符操作
        word = ocr.classification(img_byte.getvalue())
        words.append(word)
    with open("imag2.png",'rb')as f:
        image1 = f.read()
    # 提取条件部分的字符(因为是从左到右进行提取刚好是我们需要的顺序)
    word = ocr.classification(image1)
    print(word)
    dict1={}
    # 成功率感人加个try
    try:
        # 为字典写入对应的坐标(value)与字符(key)
        for i in range(len(word)):
            dict1.update({words[i]:poses[i]})
            print(dict1)
        # 通过ActionChains去调用driver对象 的move_by_offset 方法 进行坐标点击
        for i in range(len(word)):
            # '坐标'值由字典[条件部分字符]获取
            ActionChains(driver).move_by_offset(835 + dict1[word[i]][0], 281 + dict1[word[i]][1]).click().perform()
            # 点击完成以后 必须回到原来的位置 不然就是在累计距离点击  (重置距离)
            ActionChains(driver).move_by_offset(-(835 + dict1[word[i]][0]), -(281 + dict1[word[i]][1])).click().perform()
            print("在点击")
            time.sleep(1)
    except:
        driver.close()
        driver.quit()
        kaishi()
    # 点击确定
    driver.find_element(By.XPATH,'//div/div/a/div[@class="geetest_commit_tip"]').click()
    print('测试完毕')
    time.sleep(10)
    driver.close()
    driver.quit()
if __name__=='__main__':
    kaishi()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值