zoukankan      html  css  js  c++  java
  • python--Selenium自动化登陆验证码网站

    Selenium自动化登陆验证码网站

    每一个脚本背后都有一个故事,我才不是没有故事的 男同学.......

    该脚本 能识别简单字母、数字的验证码

    脚本思路:

    1. yz_code(): 打开网页,将浏览器最大化。然后定位验证码的位置,截取验证码对应的区域,将图片保存,然后进行二值化处理,再进行文本识别。

    其实这么做的原因很简单:不会将验证码图片直接进行保存,然后再识别,这样识别率会更加高。

    def yz_code():
        bbox = (1348, 423, 1455, 455)  # 截图范围,这个取决你验证码的位置
        img = ImageGrab.grab(bbox=bbox)
        img.save("D:\py\login\image_code.jpg")   # 设置路径
        # img.show()
    
        img = Image.open('image_code.jpg')  # PIL库加载图片
        # print img.format, img.size, img.mode  # 打印图片信息
        img = img.convert('RGBA')  # 转换为RGBA
        pix = img.load()  # 读取为像素
        for x in range(img.size[0]):  # 处理上下黑边框
            pix[x, 0] = pix[x, img.size[1] - 1] = (255, 255, 255, 255)
        for y in range(img.size[1]):  # 处理左右黑边框
            pix[0, y] = pix[img.size[0] - 1, y] = (255, 255, 255, 255)
        for y in range(img.size[1]):  # 二值化处理,这个阈值为R=95,G=95,B=95
            for x in range(img.size[0]):
                if pix[x, y][0] < 95 or pix[x, y][1] < 95 or pix[x, y][2] < 95:
                    pix[x, y] = (0, 0, 0, 255)
                else:
                    pix[x, y] = (255, 255, 255, 255)
    
        img.save("temp.jpg")  # 由于tesseract限制,这里必须存到本地文件
    
        image = Image.open('temp.jpg')
    
        signin_code = pytesseract.image_to_string(image)
        return signin_code
        print signin_code

    2. login(): 进行selenium的登录操作。(这里可以看“虫师”的教程,简单,易懂,我这里就不解释了)

    def login():
        driver.maximize_window()
        time.sleep(3)
    
        code = yz_code()
    
        driver.find_element_by_id('username').clear()
        driver.find_element_by_id('username').send_keys('123456') # 账号
        time.sleep(3)
        driver.find_element_by_id('password').clear()
        driver.find_element_by_id('password').send_keys('123456')   #  密码
        time.sleep(3)
        driver.find_element_by_id('verifyCode').send_keys(code)
        time.sleep(3)
        driver.find_element_by_id('loginform').click()
        time.sleep(5)

    3. code_err(): 因为我登陆的这个网站,验证码错误的时候会有信息显示在界面,所以我这里就通过抓取文本信息,判断验证码是否识别正确

    def code_err():
        try:
            a = driver.find_element_by_id('status').text
            print a
            if a == '验证码不正确!':
                return 0
        except:
            print u"验证码识别正确"
            return 1

    4. 主程序

             执行登陆操作,验证码识别成功,登陆成功后 则进行点击“loginbutton”的操作

                                         验证码识别失败,则一直执行登陆操作,直至登陆成功

        while 0==0:
            login()
            code_err()  # 判断验证码
            i = code_err()
            if i==1:
                break
        driver.find_element_by_xpath('//*[@id="loginButton"]').click()
        time.sleep(3)
        driver.quit()

    程序源码:

    # coding=utf-8
    
    from selenium import webdriver
    import time
    import pytesseract
    from PIL import Image,ImageGrab
    
    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')
    
    def yz_code():
        bbox = (1348, 423, 1455, 455)  # 截图范围,这个取决你验证码的位置
        img = ImageGrab.grab(bbox=bbox)
        img.save("D:\py\login\image_code.jpg")   # 设置路径
        # img.show()
    
        img = Image.open('image_code.jpg')  # PIL库加载图片
        # print img.format, img.size, img.mode  # 打印图片信息
        img = img.convert('RGBA')  # 转换为RGBA
        pix = img.load()  # 读取为像素
        for x in range(img.size[0]):  # 处理上下黑边框
            pix[x, 0] = pix[x, img.size[1] - 1] = (255, 255, 255, 255)
        for y in range(img.size[1]):  # 处理左右黑边框
            pix[0, y] = pix[img.size[0] - 1, y] = (255, 255, 255, 255)
        for y in range(img.size[1]):  # 二值化处理,这个阈值为R=95,G=95,B=95
            for x in range(img.size[0]):
                if pix[x, y][0] < 95 or pix[x, y][1] < 95 or pix[x, y][2] < 95:
                    pix[x, y] = (0, 0, 0, 255)
                else:
                    pix[x, y] = (255, 255, 255, 255)
    
        img.save("temp.jpg")  # 由于tesseract限制,这里必须存到本地文件
    
        image = Image.open('temp.jpg')
    
        signin_code = pytesseract.image_to_string(image)
        return signin_code
        print signin_code
    
    def login():
        driver.maximize_window()
        time.sleep(3)
    
        code = yz_code()
    
        driver.find_element_by_id('username').clear()
        driver.find_element_by_id('username').send_keys('123456') # 账号
        time.sleep(3)
        driver.find_element_by_id('password').clear()
        driver.find_element_by_id('password').send_keys('123456')   #  密码
        time.sleep(3)
        driver.find_element_by_id('verifyCode').send_keys(code)
        time.sleep(3)
        driver.find_element_by_id('loginform').click()
        time.sleep(5)
    
    def code_err():
        try:
            a = driver.find_element_by_id('status').text
            print a
            if a == '验证码不正确!':
                return 0
        except:
            print u"验证码识别正确"
            return 1
    
    
    
    if __name__=="__main__":
    
        driver = webdriver.Chrome()
        driver.get("http//:www.baidu.com")
    
    
        while 0==0:
            login()
            code_err()  # 判断验证码
            i = code_err()
            if i==1:
                break
        driver.find_element_by_xpath('//*[@id="loginButton"]').click()
        time.sleep(3)
        driver.quit()

    小弟的github:

    https://github.com/627886474

  • 相关阅读:
    自定义控件小结进阶篇
    SQL注入语句 (很全)
    C# winform DataGridView 属性说明 [C# .NET]
    MDI窗体程序中防止子窗体被多次实例化——Singleton的C#实现
    精妙SQL语句大全
    sql语句
    注销时关闭当前窗体,返回登入界面
    C#中DataGridView的使用 [C# .NET]
    C#开发 WinForm中窗体显示和窗体传值相关知识
    HDU2553 (N皇后)
  • 原文地址:https://www.cnblogs.com/jinjidedale/p/6744346.html
Copyright © 2011-2022 走看看