在爬虫过程中,验证码和滑块验证是常见的反爬措施。针对这些挑战,通常采用OCR识别图形验证码和模拟滑块拖动来处理滑块验证。以下是如何处理这两种类型验证的详细方法。
1. 图形验证码(OCR)
a. 使用 tesserocr
和 Pillow
处理图形验证码
tesserocr
是基于 Tesseract OCR 引擎的 Python 封装,常用来识别简单的图形验证码。如果验证码不太复杂,可以用它来识别文本。
步骤:
-
安装依赖:
pip install tesserocr pillow
-
验证码处理示例:
import re
import tesserocr
from PIL import Image
from io import BytesIO
from selenium import webdriver# 预处理验证码图像
def preprocess(image):image = image.convert('L') # 转换为灰度图像image = image.point(lambda x: 0 if x < 140 else 255) # 二值化处理return image# 打开浏览器并获取验证码
browser = webdriver.Chrome()
browser.get('https://captcha7.scrape.center/') # 更换为你的验证码页面captcha_element = browser.find_element_by_css_selector('#captcha')
captcha_image = Image.open(BytesIO(captcha_element.screenshot_as_png))# 图像预处理
processed_image = preprocess(captcha_image)# OCR识别验证码
captcha_text = tesserocr.image_to_text(processed_image)
captcha_text = re.sub(r'\W', '', captcha_text) # 移除非字母数字字符
print('识别的验证码:', captcha_text)browser.quit()
b. 如果验证码非常复杂,可能需要:
- 更好的图像预处理(如降噪、去除背景)。
- 使用机器学习模型来识别复杂验证码。
2. 滑块验证
滑块验证是一种基于用户拖动操作的验证形式,通常在登录、注册等过程中遇到。可以使用 Selenium 模拟滑动操作,并且通过 ActionChains
实现拖拽效果。
滑块验证的步骤:
- 定位滑块和拖动轨道。
- 模拟拖动动作(通过
ActionChains
模拟滑动轨迹)。
代码示例:
import time
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By# 初始化浏览器
browser = webdriver.Chrome()
browser.get('https://example.com') # 替换为有滑块验证的网页# 等待加载完成并找到滑块
time.sleep(2) # 等待页面加载
slider = browser.find_element(By.CSS_SELECTOR, '.slider-button') # 滑块选择器
slider_track = browser.find_element(By.CSS_SELECTOR, '.slider-track') # 滑动轨道选择器# 模拟拖动滑块
action = ActionChains(browser)# 拖动操作,假设滑动距离为轨道宽度
action.click_and_hold(slider).perform()
action.move_by_offset(300, 0).perform() # 300是大致的滑动距离,可能需要动态计算
action.release().perform()# 模拟滑动后等待验证
time.sleep(2)browser.quit()
c. 滑动轨迹的处理:
- 滑动轨迹可以通过计算滑块轨道的宽度或者通过图像处理找到滑块的终点。
- 滑块验证往往不仅要求完成动作,还要求模拟人类的行为(加速、减速,非匀速滑动),否则可能会失败。
滑动行为模拟:
import random
import time# 生成随机滑动轨迹
def generate_track(distance):track = []current = 0mid = distance * 4 / 5t = 0.2v = 0while current < distance:if current < mid:a = 2else:a = -3v0 = vv = v0 + a * tmove = v0 * t + 1 / 2 * a * t * tcurrent += movetrack.append(round(move))return track# 使用 ActionChains 模拟拖动
def simulate_dragging(browser, slider, distance):track = generate_track(distance)action = ActionChains(browser)action.click_and_hold(slider)for x in track:action.move_by_offset(xoffset=x, yoffset=0)action.release().perform()slider = browser.find_element(By.CSS_SELECTOR, '.slider-button')
simulate_dragging(browser, slider, 300)
这个代码生成的滑动轨迹会有加速和减速,模拟人类操作。
总结:
- 图形验证码:使用
tesserocr
结合预处理来识别简单的验证码;如果验证码复杂,可以使用机器学习。 - 滑块验证:使用
Selenium
的ActionChains
模拟拖动操作,并生成人类模拟的轨迹避免被检测为机器操作。
如果验证码或滑块验证过于复杂,可以考虑使用打码平台(如 Ruokuai、2Captcha)来自动识别验证码和滑块验证。