逻辑:想要获取站验证码图片,代码是先全屏截取图片 然后通过获取验证码大小,从全屏图片上裁剪验证图片,执行代码后发现验证码图片裁剪位置不对 以下是代码及截取图片
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")
方法解释:
chrome_options.add_argument("--headless")
,以便在后台运行chrome浏览器。time.sleep(2)
等待验证码图片加载完成,确保可以成功获取验证码。screenshot.png
保存全屏截图,使用captcha.png
保存裁剪后的验证码图片。crop()
方法根据验证码在全屏图片中的位置和大小进行裁剪。裁剪的区域通过(left, top, right, bottom)的方式进行指定,分别代表验证码左上角和右下角的坐标点。【相关推荐】