验证码登录最简单的方法 | Python技能树征题

题目:利用selenium来登录 (乐业天空),并模拟验证码登录。

思路:需要将验证码进行截图分析验证码信息,并利用识图取字的模块(pytesseract)来识别验证码,需要注意的是其识别度不高一些简单验证码来识别是可以的。

答案:

# -*- coding: UTF-8 -*-

from selenium import webdriver
import time
import re
import pytesseract
from PIL import Image


def get_code(temp_driver):
    temp_driver.maximize_window()
    temp_driver.save_screenshot("./screen_code.png")
    # img_lo = temp_driver.find_element_by_id("img_code")
    # img_location = img_lo.location
    # 我这里直接写要截图中验证码的大小
    img_size = {"width": 150, "height": 36}
    # 截图下来的验证码出于的位置,直接获取该元素的位置不准确
    img_location = {"x": 653, "y": 404}
    # print(img_size)
    tangle = (img_location['x'], img_location['y'],
              img_location['x'] + img_size['width'],
              img_location['y'] + img_size['height'])
    # print(tangle)
    img = Image.open("./screen_code.png")
    # 在screen_code.png图片上 截取验证码图片
    frame = img.crop(tangle)
    # 保存截取的验证码图
    frame.save("./code.png")
    image = Image.open("./code.png")
    # 识别验证码的字
    code = pytesseract.image_to_string(image)
    code = re.sub(r"\s", "", code)
    print("识别出的验证码内容", code)
    return code


def main():
    while True:
        url = "http://www.myjobsky.com/Account/Login"
        driver = webdriver.Chrome()
        driver.get(url)
        # content = driver.page_source
        # print(content)
        phone_number = driver.find_element_by_name("accountName")
        phone_number.click()
        # 用户号码
        phone_number.send_keys("18*******48")
        password = driver.find_element_by_name("accountPwd")
        time.sleep(1)
        password.click()
        # 用户密码
        password.send_keys("******")
        lo_code = get_code(driver)
        login_code = driver.find_element_by_name("picCode")
        time.sleep(1)
        login_code.click()
        login_code.send_keys(lo_code)
        time.sleep(1)
        login = driver.find_element_by_class_name("btn")
        login.click()
        try:
            time.sleep(5)
            # 保存登录成功的截图
            driver.save_screenshot("./login_success.png")
        except:
            pass
        else:
            driver.quit()
            break


if __name__ == '__main__':
    main()

运行结果:

验证码登录最简单的方法 | Python技能树征题_第1张图片

 一共尝试了三次后识别出来正确的验证码。

 

验证码登录最简单的方法 | Python技能树征题_第2张图片

 login_success.png

验证码登录最简单的方法 | Python技能树征题_第3张图片

 

你可能感兴趣的:(Python,python,算法)