说在前面: 首要运用 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,这方面要重点考虑。)

验证码产品:免费运用