selenium学习的时候,使用lmage模块进行验证码截取时候发现并没有截取到验证码位置,记录一下这个问题。
问题原因:lmage模块在进行图片截取的时候,默认是按照浏览器100%显示的方式进行截取,如果把保存的截图再lmage模块进行打开,电脑的显示与浏览器不同步的话,会导致位置发生偏差。具体坐标定位方式可看这位前辈的篇文章:JS视口坐标,屏幕坐标,页面坐标分析-CSDN博客
解决方法:
一是:将截图获取的图片进行缩放再还原
具体有三种处理方式,我试了一下前面两种是可行的
1)在电脑中把这个设置调回100%。
这个方式的话,对于调成100%没有影响的话,可以直接使用这个
2)在给crop()参数的时候,全部乘以对应的比列
3)执行js,对页面进行缩放
具体处理方法:借鉴这个前辈的:https://www.cnblogs.com/jiyu-hlzy/p/12155738.html
二是:直接使用无头浏览器可以无视这个情况。
具体处理方法:借鉴这个前辈的:
贴一下自己的代码:
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium import webdriver
from time import sleep
from PIL import Image
import time
import os
# 无头浏览器
opt = Options()
opt.add_argument('--headless')
opt.add_argument('--no-sandbox')
opt.add_argument('--disable-dev-shm-usage')
path_chromedriver = Service(executable_path=r"./driver/chromedriver.exe")
driver = webdriver.Chrome(service=path_chromedriver,options=opt)
driver.get("xxxxxxxx")
sleep(1)
# 创建下载文件夹
file_path = r"./data/嘉选网验证码/" + time.strftime("%Y%m%d") + "/"
if not os.path.exists(file_path):
os.mkdir(file_path)
#判断该文件夹下是否有重名的图片,如果没有则新建一张图片
i = 0
captcha_photo = str(i) + ".png"
while captcha_photo in os.listdir(file_path): #os.listdir(file_path)返回的内容是文件夹下的所有文件,并以列表的形式展示
i += 1
captcha_photo = str(i) + ".png"
# 获取当前页面截图
login_page = driver.save_screenshot(file_path + captcha_photo)
dpr = driver.execute_script('return window.devicePixelRatio')
# 对整个页面截图进行处理,提取出指定验证码图片
#确定验证码图片坐标
code_img_ele = driver.find_element(By.ID,'vcodesrc')
location = code_img_ele.location #验证码左上角的坐标
size = code_img_ele.size #验证码宽度
# 对应的是验证码左上角的坐标
# 在浏览器中的坐标轴是倒坐标轴,坐标轴起点在左上角方向
print(location,size)
k = 1.25 #windows电脑设置中的分辨率
x = location["x"] #验证码左上角x轴数值
y = int(location["y"]) #验证码左上角y轴数值
width = int(size["width"]) #验证码的长
height = int(size["height"]) #验证码的宽
#未设置成无头浏览器则需要使用分辨率变换进行处理
# rangle = (
# (x * k), (y * k), (x * k) + (width * k), (y * k) + (height * k)
# )
#设置成无头浏览器则不需要考虑分别率
rangle = (
x , y , x + width , y + height
)
print(rangle)
# 图片裁剪
# 打开保存的网页截图
open_captcha_photo= Image.open(file_path + captcha_photo)
captcha_photo_new = str(i) + "-" + "1.png"
code_img_name = file_path + captcha_photo_new
# 对指定区域进行裁剪
frame = open_captcha_photo.crop(rangle)
frame.save(code_img_name)
print("验证码裁剪成功!!!")