在使用Selenium下载图片验证码时,由于验证码通常是动态生成的,直接通过URL下载可能会遇到验证码内容不一致的问题。因此,更可靠的方法是使用Selenium的截图功能,然后裁剪出验证码部分。
再通过第三方服务(如AntiCaptcha、2Captcha等)提供图片验证码的破解服务。你可以通过API将这些服务集成到你的脚本中。这种方法需要付费,并且破解成功率不一定高。如果验证码图片的模式非常简单(如只有数字或字母,且没有扭曲、变形等),你可以尝试使用OCR(光学字符识别)技术来自动识别。Python中有一些OCR库,如Tesseract,可以与Selenium结合使用。但请注意,这种方法对复杂或扭曲的验证码效果较差。
示例代码:
python
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from PIL import Image
import time
# 启动Chrome WebDriver
driver = webdriver.Chrome(executable_path='path/to/chromedriver')
# 打开目标网页
driver.get('https://example.com/login') # 替换为实际网址
# 等待验证码元素加载(根据需要调整等待时间)
time.sleep(5)
# 定位验证码元素(根据网页实际情况选择定位方法)# 替换为实际验证码元素的ID
captcha_element = driver.find_element_by_id('captcha_element_id')
# 截取网页截图
full_page_screenshot = driver.get_screenshot_as_png()
full_page_image = Image.open(io.BytesIO(full_page_screenshot))
# 获取验证码元素的位置和大小
location = captcha_element.location
size = captcha_element.size
left = location['x']
top = location['y']
right = left + size['width']
bottom = top + size['height']
# 裁剪验证码图片
captcha_image = full_page_image.crop((left, top, right, bottom))
# 保存裁剪后的图片
captcha_image.save('captcha.png')
# 关闭WebDriver(可选,根据需求决定是否在此处关闭)
driver.quit()
python
def capture_code(driver, capture_el, default_path=r'captcha.png'):
'''
截取验证码图片
:param driver: 浏览器对象
:param capture_el: 定位验证码元素
:return: 无
'''
image_info = driver.get_screenshot_as_png() # 截取网页截图
image_info = Image.open(io.BytesIO(image_info))
location = capture_el.location # 获取验证码元素的位置和大小
size = capture_el.size
left = location['x']
top = location['y']
right = left + size['width']
bottom = top + size['height']
image = image_info.crop((left, top, right, bottom)) # 裁剪验证码图片
image.save(default_path) # 保存裁剪后的图片
time.sleep(3)