问题记录:python爬虫,电脑显示不是100%,导致调用Image模块截图与理想位置偏差情况

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("验证码裁剪成功!!!")

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值