针对反爬措施,Python可以使用以下策略来跳过图像验证码与滑块验证码、反检测Selenium,以及通过动态IP规避限制。这是一个分步说明:
1. 图像验证码的跳过与破解
1.1 图像验证码处理
对于简单的图像验证码,可以使用 OCR 技术直接识别验证码内容。常用库包括:
Tesseract-OCR: 一款开源 OCR 工具。
Pytesseract: Tesseract 的 Python 封装。
实现示例
from PIL import Image
import pytesseract
# 加载验证码图片
image = Image.open("captcha.jpg")
# OCR 识别验证码
captcha_text = pytesseract.image_to_string(image)
print("识别的验证码是:", captcha_text)
注意
如果验证码经过干扰(如噪声或扭曲),可以先通过 OpenCV 进行图像预处理,例如二值化、去噪等。
import cv2
# 加载图片
image = cv2.imread("captcha.jpg", 0)
# 二值化处理
_, thresh_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)
# 保存处理后的图像
cv2.imwrite("processed_captcha.jpg", thresh_image)
1.2 滑块验证码处理
对于滑块验证码,一般需要模拟拖动行为。常用工具:
Selenium:用于操作网页。
OpenCV:识别滑块和背景的缺口位置。
核心思路
使用 Selenium 加载滑块验证码页面。
使用 OpenCV 检测背景缺口位置。
模拟拖动滑块的行为。
实现示例
from selenium import webdriver
import time
import cv2
import numpy as np
from selenium.webdriver.common.action_chains import ActionChains
# 加载页面
driver = webdriver.Chrome()
driver.get("https://example.com/captcha")
# 截取滑块背景图
background = driver.find_element("id", "background-image")
background.screenshot("background.png")
# 截取滑块图
slider = driver.find_element("id", "slider-image")
slider.screenshot("slider.png")
# 使用 OpenCV 计算滑块缺口位置
def calculate_offset(bg_path, slider_path):
bg_img = cv2.imread(bg_path, 0)
slider_img = cv2.imread(slider_path, 0)
res = cv2.matchTemplate(bg_img, slider_img, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
return max_loc[0] # 返回缺口的 x 坐标
offset = calculate_offset("background.png", "slider.png")
print("缺口位置:", offset)
# 模拟拖动滑块
slider = driver.find_element("id", "slider-handle")
action = ActionChains(driver)
action.click_and_hold(slider).perform()
action.move_by_offset(xoffset=offset, yoffset=0).perform()
time.sleep(0.5)
action.release().perform()
2. 反 Selenium 检测
2.1 修改 WebDriver 属性
很多网站通过检查 navigator.webdriver
或 WebDriver 指纹来识别 Selenium,解决方案如下:
修改 WebDriver 属性
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--disable-blink-features=AutomationControlled")
driver = webdriver.Chrome(options=options)
# 修改 navigator.webdriver 属性
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
driver.get("https://example.com")
2.2 隐藏 Selenium 指纹
使用 undetected-chromedriver
库自动隐藏 Selenium 的常见指纹。
安装
pip install undetected-chromedriver
示例代码
import undetected_chromedriver.v2 as uc
driver = uc.Chrome()
driver.get("https://example.com")
3. 动态 IP 切换
3.1 使用代理 IP
通过代理服务器动态切换 IP,常见的代理服务包括免费代理、爬虫代理池或购买代理服务。
示例代码
from selenium import webdriver
proxy = "http://username:password@proxyserver:port" # 替换为你的代理信息
options = webdriver.ChromeOptions()
options.add_argument(f"--proxy-server={proxy}")
driver = webdriver.Chrome(options=options)
driver.get("https://example.com")
3.2 搭建代理池
使用 requests
配合代理池实现动态 IP 切换。可以使用开源代理池项目如 IPProxyPool 或 自建代理池。
示例代码
import requests
# 示例代理池
proxies = [
"http://proxy1:port",
"http://proxy2:port",
"http://proxy3:port"
]
# 动态切换代理
for proxy in proxies:
try:
response = requests.get("https://example.com", proxies={"http": proxy, "https": proxy}, timeout=5)
print(f"IP {proxy} 访问成功: {response.status_code}")
except Exception as e:
print(f"IP {proxy} 访问失败: {e}")
4. 综合反爬策略
模拟真实用户行为
随机设置鼠标移动轨迹和速度。
设置动态的 User-Agent
。
动态加载时间
添加 time.sleep
随机延迟,模拟真实的用户行为。
分布式爬取
将任务分发到多个代理 IP 或服务器,减少单 IP 压力。
日志监控
实时监控请求返回状态,动态调整代理或重试策略。
通过以上方法,可以有效处理反爬中常见的图像验证码、滑块验证码、动态 IP 和 Selenium 检测问题。在实践中需要根据目标网站的反爬策略灵活调整代码。
发布者:myrgd,转载请注明出处:https://www.object-c.cn/4896