首页 > 编程语言 >【Python-WebDriver实战篇】处理验证码的方式

【Python-WebDriver实战篇】处理验证码的方式

时间:2022-08-23 17:59:28浏览次数:111  
标签:WebDriver 实战篇 code Python self 验证码 element location print

【Selenium-WebDriver实战篇】Selenium验证码处理方式

之前记录过使用java去处理验证码的方式,但是总是不是特别理想,会有错误的时候。

这两天项目需要,就调研了下用python去破解4位数字的验证码,中间夹杂干扰项,效果是:

图片上不复杂的时候,会成功。

图片上有干扰项的时候,会识别错误(少位数或有英文)。

解决方案:

当识别的结果不足4位,或不是纯数字时,让其再进行刷新再识别。

这样以后,成功概率会 很高。

帮助比较大的网站参考:

https://blog.csdn.net/weixin_58839230/article/details/124243584

一、安装ddddocr
通过命令将自动安装符合自己电脑环境的最新 ddddocr。

pip install ddddocr

 

如果安装速度慢,可以连接国内镜像进行安装,命令如下:

pip install ddddocr -i https://pypi.tuna.tsinghua.edu.cn/simple/

二、使用实战

识别的核心代码:

import ddddocr

ocr = ddddocr.DdddOcr()
with open('code.png', 'rb') as f:
    img_bytes = f.read()
res = ocr.classification(img_bytes)
print('识别出的验证码为:' + res)

详细代码部分:

登录代码:

    # 用户登录
    def user_login(self):
        # 输入信息
        username = 'test'
        password = '1234'

        print("请在页面输入用户名/密码登录")
        username_input = self.driver.find_element(By.NAME, value = 'username')
        # 输入用户名
        username_input.send_keys(username)
        print('输入用户名:' + username)
        time.sleep(1)

        # 输入密码
        password_input = self.driver.find_element(By.NAME, value = 'password')
        password_input.send_keys(password)
        print('输入密码:' + password)
        time.sleep(1)

        # 获取验证码
        verifycode = self.getVerification()
        isRight = False
        # 如果识别的验证码长度不是4,重新点击获取
        while isRight == False:
            if len(verifycode) != 4 or verifycode.isdigit() == 'False':
                print("验证码不是纯数字时,多次获取")
                # 定位验证码
                code_img_element = self.driver.find_element(By.CLASS_NAME, value = 'el-image__inner')
                code_img_element.click()
                verifycode = self.getVerification()
            else :
                isRight = True

        # 输入验证码
        code_input = self.driver.find_element(By.NAME, value = "code")
        code_input.send_keys(verifycode)
        time.sleep(1)

        # 点击登录按钮
        self.driver.find_element(By.XPATH,value = "//*[text()='登录']").click()
        time.sleep(1)

        print("登录成功")
        time.sleep(1)

        cookies = self.driver.get_cookies()
        token_vaule = cookies[0]['value']
        print(token_vaule)
        input("查看cookie是否正确")

        self.driver.quit()

判断验证码的代码:

    # 获取验证码信息
    def getVerification(self):
        # 获取当前文件的位置、并获取保存截屏的位置
        screenshot_path = YIQING_SCREEN_PATH
        code_path = YIQING_CODE_PATH

        time.sleep(1)
        # 截取当前网页并放到自定义目录下,并命名为printscreen,该截图中有我们需要的验证码
        self.driver.save_screenshot(screenshot_path)
        time.sleep(1)
        # 定位验证码
        code_img_element = self.driver.find_element(By.CLASS_NAME, value = 'el-image__inner')
        # 获取验证码x,y轴坐标
        location = code_img_element.location
        print('location[x]:' + str(location['x']) + 'location[y]:' + str(location['y']))
        # 获取验证码的长宽
        size = code_img_element.size
        print('size[width]:' + str(size['width']) + 'size[height]:' + str(size['height']))
        # 写成我们需要截取的位置坐标
        rangle = (int(location['x']),
                  int(location['y']),
                  int(location['x'] + size['width']),
                  int(location['y'] + size['height']))
        # 打开截图
        i = Image.open(screenshot_path)
        # 使用Image的crop函数,从截图中再次截取我们需要的区域
        fimg = i.crop(rangle)
        fimg = fimg.convert('RGB')
        # 保存我们截下来的验证码图片,并读取验证码内容
        fimg.save(code_path)

        ocr = ddddocr.DdddOcr()
        with open(code_path, 'rb') as f:
            img_bytes = f.read()
        self.res = ocr.classification(img_bytes)
        print('识别出的验证码为:' + self.res)
        return self.res

 

标签:WebDriver,实战篇,code,Python,self,验证码,element,location,print
From: https://www.cnblogs.com/conquerorren/p/16617249.html

相关文章

  • python基础——while循环
    while循环语法while条件:条件成立重复执行的代码1条件成立重复执行的代码2......应用#计算1-100累加和i=1result=0whilei<=100:resu......
  • Ubuntu 如何使用Apt在Ubuntu 18.04上安装Python 3.8
    1、以root用户或具有sudo访问权限的用户身份运行以下命令,以更新软件包列表并安装必备组件:sudoaptupdatesudoaptinstallsoftware-properties-common2、将Deadsnak......
  • 十年老程序员:C、Python、Java 不可兼得,专心学好一门编程语言就行!
    序言哈喽兄弟萌,很多铁铁在刚开始学编程的时候,总是避免不了看到某些哗众取宠的博主发的视频或者文章,说建议同时学好几门语言,一尝试发现,同时学好几个编程语言确实没有压......
  • python 3回顾
    ord()    获取字符的整数表示char()   把编码转换成对应的字符   python可执行文件的两个开头注释信息 第二行的注释是为了让它按照UFT-8的编......
  • 什么?fei lu被python采集拉~(含完整源代码)
    前言嗨喽,大家好呀~这里是爱看美女的茜茜呐环境使用:Python3.8Pycharm[模块使用]:requests>>>数据请求模块parsel>>>数据解析模块re正则表达式......
  • python基础——变量 数据类型 运算符 格式化 if语句复习
    拓展+复习:1.input(’'你要输入的内容')--输入2.print('你要输入的内容')--输出/打印3.注释多行,单行多行注释”“”“”“''''''#ctrl+/4.变量的定义定义变量的......
  • Python中items()函数
    一、items()遍历字典中的元素遍历输出所有的key和value,以元组的形式1dict={'name':'python','define':'programminggrammer'}2foritemindict.items():#......
  • Python-10作用域、LEGB规则
    作用域就是一个Python程序可以直接访问命名空间的正文区域。在一个python程序中,直接访问一个变量,会从内到外依次访问所有的作用域直到找到,否则会报未定义的错误。Pyt......
  • 【735】相关python函数用在算法题中提高效率
    Counter:用来计数使用fromcollectionsimportCounterfilter:用来表示满足一个函数的所有情况相关题目:260.只出现一次的数字III......
  • 《流畅的python》PDF高清版|百度云盘|免费下载
      《流畅的python》PDF高清版|百度云盘|免费下载  内容简介······【技术大咖推荐】“很荣幸担任这本优秀图书的技术审校。这本书能帮助很多中级P......