likes
comments
collection
share

实践 | 怎么用Python实现滑动验证码

作者站长头像
站长
· 阅读数 3

说在前面: 主要使用 Python 的 Selenium 库和对应的 WebDriver(例如 ChromeDriver),通过模拟鼠标操作实现。

代码示例

接下来直接上干货:

  1. 使用 Selenium 启动浏览器,并打开验证码页面。
from selenium import webdriver

driver = webdriver.Chrome() # 使用 Chrome 浏览器
driver.get('https://example.com/captcha') # 打开验证码页面

  1. 切换到包含验证码的 iframe 中。
iframe = driver.find_element_by_xpath('//iframe[@id="captcha-iframe"]')
driver.switch_to.frame(iframe)

  1. 找到验证码的滑块和背景图片,并使用 Pillow 库加载图片。
from PIL import Image
from io import BytesIO

slider = driver.find_element_by_xpath('//div[@class="slider"]')
slider_img = slider.find_element_by_xpath('.//img').get_attribute('src')
bg = driver.find_element_by_xpath('//div[@class="bg"]')
bg_img = bg.find_element_by_xpath('.//img').get_attribute('src')

bg_image = Image.open(BytesIO(requests.get(bg_img).content))
slider_image = Image.open(BytesIO(requests.get(slider_img).content))

  1. 使用图像处理库(例如 OpenCV)找到滑块在背景图片中的位置。
import cv2

# 把 PIL 图像转换为 OpenCV 图像
bg_cv = cv2.cvtColor(np.array(bg_image), cv2.COLOR_RGB2BGR)
slider_cv = cv2.cvtColor(np.array(slider_image), cv2.COLOR_RGB2BGR)

# 使用模板匹配算法找到滑块在背景图片中的位置
result = cv2.matchTemplate(bg_cv, slider_cv, cv2.TM_CCOEFF_NORMED)
y, x = np.unravel_index(result.argmax(), result.shape)

  1. 计算滑块需要移动的距离,并使用 Selenium 执行滑动操作。
from selenium.webdriver.common.action_chains import ActionChains

slider_width = slider.size['width']
distance = x + slider_width / 2

actions = ActionChains(driver)
actions.click_and_hold(slider).perform()
actions.move_by_offset(distance, 0).perform()
actions.release().perform()

整体的代码的话,就是:

import requests
from PIL import Image
from io import BytesIO
import numpy as np
import cv2
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.get('https://example.com/captcha')

iframe = driver.find_element_by_xpath('//iframe[@id="captcha-iframe"]')
driver.switch_to.frame(iframe)

slider = driver.find_element_by_xpath('//div[@class="slider"]')
slider_img = slider.find_element_by_xpath('.//img').get_attribute('src')
bg = driver.find_element_by_xpath('//div[@class="bg"]')
bg_img = bg.find_element_by_xpath('.//img').get_attribute('src')

bg_image = Image.open(BytesIO(requests.get(bg_img).content))
slider_image = Image.open(BytesIO(requests.get(slider_img).content))

bg_cv = cv2.cvtColor(np.array(bg_image), cv2.COLOR_RGB2BGR)
slider_cv = cv2.cvtColor(np.array(slider_image), cv2.COLOR_RGB2BGR)

result = cv2.matchTemplate

注意事项

在实际应用过程中,要注意:

1.要看自己网站具体情况定位和提取验证码的 HTML 结构和 CSS 样式。

2.要根据自己的需求加入发爬措施,比如图片大小、位置、颜色等的变化。(这个比较重要,因为如果只是普通的验证码,那么安全性其实不能得到很大的保证,而且现在黑灰产的工具很多,不多方防范的话,就相当于只是修了一个“破烂的门”)

3.代码中用到了第三方库(如 Pillow、OpenCV)和模拟鼠标操作,需要确保在合法和可控的情况下使用。(合规问题不用具体说了,如果是自己做的小程序,不上架的话,可以不用太考虑这方面问题,但是如果需要上架,尤其是App Sotre,这方面要重点考虑。)