Python 获取b站截取验证码大小不对

逻辑:想要获取站验证码图片,代码是先全屏截取图片 然后通过获取验证码大小,从全屏图片上裁剪验证图片,执行代码后发现验证码图片裁剪位置不对 以下是代码及截取图片

img

img

img


完整代码


import datetime
import os
import json
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ES
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
from PIL import Image

#
# class Bilibili_auto:
#
#     def __init__(self):
#         pass
#
#     def Initiate_chrome(self):
#         a = 'd1d'
driver = webdriver.Chrome()
driver.get('https://www.bilibili.com/')
driver.maximize_window()
wait = WebDriverWait(driver,10)
ClickSignIn = wait.until(ES.presence_of_element_located((By.XPATH,'//*[@id="i_cecream"]/div[2]/div[1]/div[1]/ul[2]/li[1]/li/div[1]/div')))
ActionChains(driver).click(ClickSignIn).perform()
Account = wait.until(ES.presence_of_element_located((By.XPATH,'//form[@class="tab__form"]/div[1]/input')))
ActionChains(driver).click(Account).send_keys('13147035668').perform()
Password = wait.until(ES.presence_of_element_located((By.XPATH, '//form[@class="tab__form"]/div[3]/input')))
ActionChains(driver).click(Password).send_keys('aaaaaa').perform()
Login = wait.until(ES.presence_of_element_located((By.XPATH,'//div[@class="btn_wp"]/div[2]')))
ActionChains(driver).click(Login).perform()
# BigPicture = wait.until(ES.presence_of_element_located((By.XPATH,'//div[@class="geetest_panel geetest_wind"][2]')))
time.sleep(10)
#全屏截图
driver.get_screenshot_as_png()
driver.save_screenshot('bigpicture.png')
#验证码对象
Minpicture = wait.until(ES.presence_of_element_located((By.XPATH,'//div[@class="geetest_widget"]')))
loction = Minpicture.location
print(loction)
size = Minpicture.size
print(size)
#裁剪验证码大小
left,top,right,bottom = loction['x'],loction['y'],(loction['x']+size['width']),(loction['y']+size['height'])
BIG_screenshot_OPEN = Image.open('bigpicture.png')
Minpicture_screenshot = BIG_screenshot_OPEN.crop((left,top,right,bottom))
Minpicture_screenshot.save('minpicture_screenshot.png')









# a= Bilibili_auto()
# 

求解答疑惑 感谢

为什么要先截取全屏呢,再找验证码位置呢?这个验证码的图片可以直接从网络就获取到了。

【以下回答由 GPT 生成】

问题解决:

import datetime
import os
import json
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ES
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
from PIL import Image

# 初始化浏览器
chrome_options = Options()
chrome_options.add_argument("--headless")  # 设置无界面模式
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get('https://www.bilibili.com/')
driver.maximize_window()
wait = WebDriverWait(driver, 10)

# 点击登录按钮
ClickSignIn = wait.until(ES.presence_of_element_located((By.XPATH, '//*[@id="i_cecream"]/div[2]/div[1]/div[1]/ul[2]/li[1]/li/div[1]/div')))
ActionChains(driver).click(ClickSignIn).perform()

# 输入账号
Account = wait.until(ES.presence_of_element_located((By.XPATH, '//*[@class="tab__form"]/div[1]/input')))
ActionChains(driver).click(Account).send_keys('13147035668').perform()

# 等待验证码图片加载完成
time.sleep(2)
captcha = wait.until(ES.presence_of_element_located((By.XPATH, '//*[@id="slideBkg"]')))
location = captcha.location
size = captcha.size

# 获取全屏截图
full_screen_image = Image.open("screenshot.png")
# 根据验证码的位置和大小裁剪出验证码图片
captcha_image = full_screen_image.crop((location["x"], location["y"], location["x"] + size["width"], location["y"] + size["height"]))
# 保存验证码图片
captcha_image.save("captcha.png")

方法解释:

  1. 添加了无界面模式的chrome选项 chrome_options.add_argument("--headless"),以便在后台运行chrome浏览器。
  2. 使用time.sleep(2)等待验证码图片加载完成,确保可以成功获取验证码。
  3. 使用screenshot.png保存全屏截图,使用captcha.png保存裁剪后的验证码图片。
  4. 使用crop()方法根据验证码在全屏图片中的位置和大小进行裁剪。裁剪的区域通过(left, top, right, bottom)的方式进行指定,分别代表验证码左上角和右下角的坐标点。
  5. 最后保存裁剪后的验证码图片。


【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^