Python使用selenium模拟登陆,截取图片验证码并转化为base64

Python使用selenium模拟登陆,截取图片验证码并转化为base64_第1张图片
Python使用selenium模拟登陆,截取图片验证码并转化为base64_第2张图片
研究好几天截取图片验证码,今天终于好了,主要图片验证在第二个iframe里面,所以在截取的时候,必须先定位最外面的iframe的坐标(简称frame1),然后在定位嵌套里面的iframe(简称frame2),在定位图片验证码在frame2中的位置,相加获取图片验证码的位置

        frame1_location = self.driver.find_element_by_id("ICBC_login_frame").location
        frame1_x = frame1_location['x']
        frame1_y = frame1_location["y"]
        # 坐标
        coordinate = {
            "frame1_x": frame1_x,
            "frame1_y": frame1_y,
        }
        # 如果文件不存在,就创建文件夹
        if not os.path.exists(".\pic"):
            os.mkdir(".\pic")
        # 截取当前网页命名为printscreen,该网页有我们需要的验证码
        self.driver.save_screenshot('.\pic\printscreen1.png')
        frame2_location = self.driver.find_elements_by_id("VerifyimageFrame")[0].location
        frame2_x = frame2_location["x"]
        frame2_y = frame2_location["y"]
        # # 切换frame,进入图片验证码
        self.driver.switch_to.frame("VerifyimageFrame")
        imgelement = self.driver.find_element_by_xpath("//img[contains(@title,'点击图片可刷新')]")  # 定位验证码
        frame1_x = coordinate["frame1_x"]
        frame1_y = coordinate["frame1_y"]
        left = int(frame1_x + frame2_x)
        top = int(frame1_y + frame2_y)
        size = imgelement.size  # 获取验证码元素长高
        element_width = int(left + size['width'])
        element_height = int(top + size["height"])
        # 打开截图
        i = Image.open(".\pic\printscreen1.png")
        # 使用Image的crop函数,从截图中再次截取我们需要的区域
        frame4 = i.crop((left, top, element_width, element_height))
        frame4 = frame4.convert('RGB')
        frame4.save('.\pic\save1.jpg')  # 保存我们接下来的验证码图片 进行打码
        # 转化为base64
        with open(".\pic\save1.jpg", "rb") as f:
            # b64encode是编码,b64decode是解码
            base64_data = base64.b64encode(f.read())
            print(base64_data)

你可能感兴趣的:(爬虫)