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

题目:利用selenium来登录 (乐业天空),并模拟验证码登录。
思路:需要将验证码进行截图分析验证码信息,并利用识图取字的模块(pytesseract)来识别验证码,需要注意的是其识别度不高一些简单验证码来识别是可以的。
答案:

# -*- coding: UTF-8 -*-from selenium import webdriver import time import re import pytesseract from PIL import Imagedef 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 codedef 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() breakif __name__ == '__main__': main()

运行结果:
【Python|验证码登录最简单的方法 | Python技能树征题】Python|验证码登录最简单的方法 | Python技能树征题
文章图片

一共尝试了三次后识别出来正确的验证码。
Python|验证码登录最简单的方法 | Python技能树征题
文章图片

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

login_success.png
Python|验证码登录最简单的方法 | Python技能树征题
文章图片


    推荐阅读