完美实现验证码登录
# login_code.py # 导包 from selenium import webdriver from selenium.webdriver.common.by import By from time import sleep from selenium.webdriver.chrome.options import Options import pytesseract # 导入ocr库 from PIL import Image # 导入图像处理库 import ddddocr # 定义类 class GetEle: def __init__(self,driver): self.driver=driver def login_name_psw(self,loc_name,loc_psw,loc_submit,login_name,login_psw): # 账号和密码输入 driver.find_element(By.CSS_SELECTOR,loc_name).send_keys(login_name) driver.find_element(By.CSS_SELECTOR, loc_psw).send_keys(login_psw) driver.find_element(By.CSS_SELECTOR, loc_submit).click() def submit_login(self,loc): driver.find_element(By.CSS_SELECTOR, loc).click() class CodePass: def __init__(self,driver): self.driver=driver def get_code(self,loc_code): # 获取全屏截图,获取坐标位置 ,截图保存 # 第一步 ---------获取到验证码的位置,截图,获取坐标 ele_cap = driver.find_element(By.CSS_SELECTOR, loc_code) # 获取元素的位置和大小 location = ele_cap.location size = ele_cap.size print(f"获取验证码元素位置location:{location},获取验证码元素大小size:{size}") # 获取整个页面截图 driver.save_screenshot("code.png") sleep(2) # 打开照片 captcha_image = Image.open("code.png") # 获取验证码的上下左右坐标 left = int(location['x']) top = int(location['y']) right = int(location['x'] + size['width']) bottom = int(location['y'] + size['height']) print(f"坐标展示 left:{left},top:{top},right:{right},bottom:{bottom}") # 第二步------------------利用坐标信息对截图图片做裁剪 # 打开图片 image = Image.open("code.png") # 裁剪图片 cropped_image = image.crop((left, top, right, bottom)) # 显示裁剪后的图片 因为show 会保持照片一直打开,直到被关闭, 所以注释掉了这个展示的动作 # cropped_image.show() # 保存裁剪后的图片 cropped_image.save("code.png") # 第三步-----------------------对截图做OCR识别 # 实例化一个ocr ocr = ddddocr.DdddOcr() # 以二进制格式打开verf.png图片用于只读 with open('code.png', 'rb') as f: # 用来读取文件 img_bytes = f.read() # 识别图片中的内容 res = ocr.classification(img_bytes) # 输出内容 print('识别出的验证码为:' + res) return res def input_code(self,loc,res): # 找到元素,输入code,点击 登录 driver.find_element(By.CSS_SELECTOR,loc).send_keys(res) # 调用 if __name__ == '__main__': ''' # 创建无头浏览器选项 options = Options() options.add_argument("--headless") # 调用driver driver=webdriver.Chrome(options=options) ''' driver = webdriver.Chrome() # url url=r"http://XXXX/forum.php" driver.get(url) # 实例化类 web_e=GetEle(driver) # 调用登录 loc_name='#ls_username' loc_psw='#ls_password' loc_submit='.pn.vm>em' login_name='sq123' login_psw='111111' web_e.login_name_psw(loc_name,loc_psw,loc_submit,login_name,login_psw) # 输入验证码 sleep(3) print("进入第二阶段 输入验证码") c=CodePass(driver) code_loc = 'img[onclick*="updateseccode"]' res=c.get_code(code_loc) # 调用获取验证码 input_code_loc = 'input[id*=seccodeverify]' c.input_code(input_code_loc,res) # 提交登录按钮 submit_loc = '[name=loginsubmit]' web_e.submit_login(submit_loc) # 退出 sleep(3) driver.quit()