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

原文地址:https://www.cnblogs.com/jinjidedale/p/6744346.html