python反爬-图像验证码与滑块验证码的跳过反selenium检测,动态ip等问题

针对反爬措施,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

Like (0)
Previous 2024年11月28日 下午7:42
Next 2024年11月28日 下午8:14

相关推荐

  • 在 Linux 系统上配置 Hadoop 环境,包括创建 hadoop 用户、更新 apt、安装 SSH 和配置 Java 环境

    以下是详细的步骤,用于在 Linux 系统上配置 Hadoop 环境,包括创建 hadoop 用户、更新 apt、安装 SSH 和配置 Java 环境。 1. 创建 Hadoop 用户创建一个名为 hadoop 的新用户: 根据提示设置密码和用户信息。 将 hadoop 用户添加到 sudo 组(可选): 切换到 hadoop 用户: 2. 更新 APT 包…

    2024年12月1日
    00
  • 解决 Vue 3 应用部署到 GitHub Pages 后,遇到 404 错误问题

    在将 Vue 3 应用部署到 GitHub Pages 后,遇到 404 错误通常是由于 GitHub Pages 处理路由时的问题。Vue 3 使用 Vue Router 来管理前端路由,而 GitHub Pages 本身是静态托管服务,不支持处理 SPA(单页面应用)的客户端路由。因此,当你直接访问某个页面 URL(比如 https://youruser…

    2024年11月29日
    00
  • Python 变量类型和输入/输出相关运算符介绍

    Python 是一种动态类型语言,变量类型由值决定,并且可以在运行时随时更改。在开发中,变量的操作与输入/输出息息相关,理解它们的运算符及常见用法非常重要。 1. Python 变量类型 Python 中变量不需要显式声明。以下是常见的变量类型和它们的特性: 类型 描述 示例 整数 (int) 用于存储整数,支持正负数和进制表示。 a = 10 浮点数 (f…

    2024年11月21日
    00
  • java中使用 Arrays.asList()新增报错问题解决方法

    Arrays.asList() 返回的是一个固定大小的列表。如果你尝试使用该列表进行添加、删除等修改操作,会抛出 UnsupportedOperationException 异常。这是因为 Arrays.asList() 返回的列表背后是一个数组,它的大小是固定的,不能进行动态修改。解决方法使用 ArrayList 包装 Arrays.asList() 的结…

    2024年12月2日
    00
  • 在 Spring Boot 中实现定时任务,通过 Spring Task Scheduling 来完成

    在 Spring Boot 中实现定时任务,可以通过 Spring Task Scheduling 来轻松完成。Spring 提供了多种方法来调度任务,其中使用 @Scheduled 注解是最常见且简单的方式。 步骤:在 Spring Boot 中实现定时任务 1. 启用定时任务 首先,确保在 Spring Boot 应用的主类或配置类中启用定时任务功能: …

    2024年11月26日
    00
  • 基于 Spring Boot 框架实现微信支付接口调用及回调功能

    实现微信支付接口调用及回调功能,以下是完整的步骤及代码实现,基于 Spring Boot 框架。 1. 微信支付开发准备 开通微信支付 配置 API 安全密钥 前往商户平台的【账户设置】-【API安全】中配置 API 密钥。 2. 集成依赖 在 Spring Boot 项目中添加 HTTP 客户端依赖,例如 RestTemplate 或 OkHttp。也可用…

    2024年11月23日
    00
  • 理解 HTML、HTML5 和 “H5” 区别的重要性

    HTML & HTML5 & H5 的区别在构建现代网页时,理解 HTML、HTML5 和 “H5” 的区别是非常重要的。以下是它们的概念和主要区别: 1. HTML(超文本标记语言)定义HTML 是 HyperText Markup Language 的缩写,即超文本标记语言,用于定义网页内容的结构和含义。特性提供基…

    2024年12月2日
    00
  • PHM技术:一维信号时序全特征分析(统计域/频域/时域)信号处理

    PHM(Prognostics and Health Management,预测与健康管理)技术中的一维信号时序特征分析,旨在从信号中提取与设备健康状态相关的多种特征。以下是针对统计域、频域和时域特征分析的详细介绍和常见方法。 1. 时域特征分析时域特征直接从原始信号提取,描述信号的统计特性或时间行为。这些特征反映信号的幅值、变化趋势和波形形状。1.1 常用…

    2024年11月28日
    00
  • C语言内存函数动态分配内存、释放内存和对内存内容进行操作。

    C语言中的内存函数主要用于动态分配内存、释放内存和对内存内容进行操作。这些函数都在标准库 <stdlib.h> 和 <string.h> 中定义。以下是 C 语言常用的内存函数及其详细说明: 1. 动态内存管理函数 这些函数位于 <stdlib.h> 中,用于在运行时分配和释放内存。 1.1 malloc 示例: 功能:分配一块指定大…

    2024年11月22日
    00
  • 实现“鼠标点击器外挂”,模拟快速点击或者自动化点击的工具

    实现一个“鼠标点击器外挂”,通常是指模拟快速点击或者自动化点击的工具。以下是一个实现的基本思路和代码示例,适合用于演示或学习目的。 功能描述自动模拟鼠标点击(单击或双击)。用户可以设置点击间隔和总点击次数。提供启动和停止按钮,方便控制。 示例实现HTML CSS (style.css) JavaScript (script.js) 功能实现说明用户输入:用户…

    2024年11月30日
    00
  • Numpy 是 Python 中用于科学计算的重要库(下载安装教程)

    Numpy 是 Python 中用于科学计算的重要库,它提供了强大的多维数组对象和丰富的数学函数。在不同环境中,安装 Numpy 的方法略有不同。以下是详细教程: 1. 使用 pip 安装(推荐方法)1.1 安装命令使用 pip 安装 Numpy 是最简单的方法: 1.2 验证安装安装完成后,运行以下命令以确认安装成功: 1.3 安装特定版本如果需要安装特定…

    2024年11月26日
    00
  • pywebview 页面请求数据总是报错:TypeError: Cannot read properties of undefined (reading ‘api’)

    pywebview 中的 TypeError: Cannot read properties of undefined (reading ‘api’) 错误通常意味着 JavaScript 代码试图访问一个未定义的对象或属性(如 api)。这种问题通常出现在 Python 与前端 JavaScript 交互时,可能是由于以下原因:可能的原因及解决方法:Jav…

    2024年11月27日
    00
  • uniapp基于vue3,element plus组件库以及axios通讯开发

    在 uniapp 前端开发中,使用 Vue3、Element Plus 组件库和 Axios 进行通讯是一种常见的组合。下面是一个简单的步骤和实践指南,帮助你更好地使用这些工具进行开发。1. 安装和配置 Vue3 和 Element Plus首先,确保你已经安装了 uniapp 项目,并且设置好相关依赖。在项目中,安装 Element Plus 组件库以便在…

    2024年11月27日
    00
  • 使用 Python 的 pip 安装 Selenium 和 WebDriver 测试环境

    Selenium 是一个强大的自动化测试工具,广泛用于 Web 应用程序的浏览器操作。以下是完整的 Selenium 教程,帮助初学者理解其基础功能和高级用法。 1. 安装 Selenium 和 WebDriver 1.1 安装 Selenium 使用 Python 的 pip 安装 Selenium: 1.2 下载 WebDriver 根据目标浏览器下载对…

    2024年11月26日
    00
  • 安装 Laravel 11 + Filament 详细教程

    安装Laravel 11之前选确保安装了Composer 管理器,接下来的步骤是通过Composer 包管理器安装完成的。 一、前提条件 二、使用 Composer 创建新的 Laravel 11 项目 三、在现有项目中添加 Laravel 11(如果是集成到现有项目) 请注意,在实际安装过程中,可能会遇到各种问题,如权限问题(在 Linux 下,如果没有足…

    2025年1月18日
    00

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

在线咨询: QQ交谈

邮件:723923060@qq.com

关注微信