验证码登录最简单的方法 | 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()

运行结果:

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

 

 login_success.png

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CJ.Williams

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值