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

相关推荐

  • 通过 PHP 读取微软邮箱(Outlook/Office 365 邮箱)

    通过 PHP 读取微软邮箱(Outlook/Office 365 邮箱)邮件,通常需要使用 Microsoft Graph API,因为微软逐步淘汰了基于用户名和密码的 IMAP/SMTP 方式。Microsoft Graph API 支持 OAuth2.0 认证,可以安全地访问和管理用户邮件。 以下是实现读取微软邮箱邮件的完整示例。 实现步骤 1. 准备工…

    2024年11月25日
    00
  • 云服务器的 宝塔面板 中配置 PHP 支持 WebP 格式的图片

    在云服务器的 宝塔面板 中配置 PHP 支持 WebP 格式的图片,主要是通过安装或启用 GD 库或者 ImageMagick 来实现 WebP 图片的处理支持。下面是一步步的操作方法:1. 确保服务器已经安装 WebP 扩展WebP 格式的支持需要 PHP 依赖于 GD 库或 ImageMagick 库。如果你使用的是 PHP 7.0 及以上版本,通常 G…

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

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

    2024年11月27日
    00
  • Python 3.10 最新版本下载安装指南(2024)

    Python 3.10 是一个稳定且功能强大的 Python 版本,支持多种新特性,如模式匹配(match/case)等。以下是 Python 3.10 最新版本的下载安装步骤。 1. 下载 Python 3.10 官方地址 2. 安装步骤 Windows 安装 如果显示 Python 3.10.x,说明安装成功。 MacOS 安装 验证安装: 应显示 Py…

    2024年11月21日
    00
  • 使用 Webpack 5 优化构建减少生成文件的体积提升前端性能

    在使用 Webpack 5 时,优化构建以减少生成文件的体积是提升前端性能的重要一步。以下是一些常见的优化方法和策略: 1. 开启生产模式 确保构建时使用生产模式,Webpack 会自动应用多种优化(如代码压缩、Tree Shaking 等): 或在配置文件中明确设置: 2. 启用 Tree Shaking Tree Shaking 是 Webpack 内置…

    2024年12月3日
    00
  • 在 .NET 8 框架中使用 Web API 项目并通过引用 SqlSugar ORM 来操作数据库

    在 .NET 8 框架中使用 Web API 项目并通过引用 SqlSugar ORM 来操作数据库,可以遵循以下步骤: 1. 准备工作确保已安装 .NET 8 SDK 和 SqlSugar NuGet 包。创建或打开现有的 Web Core API 项目。安装 SqlSugar NuGet 包: 2. 配置 SqlSugar在 Web API 项目中配置 …

    2024年11月27日
    00
  • 在开发 Angular 项目时,使用 RangeSlider 控件时的常见问题

    在开发 Angular 项目时,使用 RangeSlider 控件时,可能会遇到一些常见的问题。以下是一些问题及其解决方案:1. 滑块值不更新问题描述:当用户拖动滑块时,滑块的值不会实时更新,或者显示的值不正确。解决方案:确保绑定的模型是双向绑定,使用 ngModel 或者监听 input 事件来确保滑块值能实时更新。例如: 确保你已经导入了 FormsMo…

    2024年11月27日
    00
  • 锁策略和优化是并发编程 synchronized 的优化,JVM 与编译器的锁优化

    锁策略和优化是并发编程中的重要话题,特别是在 Java 中,synchronized 作为基本的内置锁机制,得到了多层次的优化。在 JVM 和编译器层面,也有多种优化策略以提升锁的性能。 1. 锁策略:不同场景下的锁机制选择 2. synchronized 的优化 2.1 早期问题 在 Java 1.5 之前,synchronized 的实现依赖重量级锁,直…

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

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

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

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

    2024年12月2日
    00
  • 使用 CLion 编写 C51 (即8051微控制器) 程序时,遇到 sbit 相关报错

    在使用 CLion 编写 C51 (即8051微控制器) 程序时,遇到 sbit 相关报错,通常是因为 CLion 默认并不支持8051的特殊语法和寄存器定义方式。sbit 是 C51 编译器中的一个关键字,用来将一个单独的位(bit)映射到特定的硬件寄存器或端口引脚。常见的报错及解决方法sbit 语法问题: CLion 本身不支持 C51 特有的语法,sb…

    2024年11月27日
    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
  • 在 .NET 环境下,使用 OpenTK 为 SkiaSharp 提供 OpenGL 支持是一个常见的方式

    在 .NET 环境下,使用 OpenTK 为 SkiaSharp 提供 OpenGL 支持是一个常见的方式,可以高效地进行 2D 图形渲染。下面是具体如何实现和一些关键概念的介绍: 背景知识 实现步骤 1. 添加必要的 NuGet 包 确保你的项目安装了以下 NuGet 包: 2. 创建 OpenGL 上下文 使用 OpenTK 创建一个 OpenGL 上下…

    2024年12月8日
    00
  • 部署 Harbor 时,如果运行 install 脚本报错可能导致问题的

    在部署 Harbor 时,如果运行 install 脚本报错,可能是网络问题导致的。以下是排查网络问题的方法: 1. 检查网络连通性 测试目标网络的连通性: 检查 DNS 配置: 如果解析失败,检查 /etc/resolv.conf 中的 DNS 配置,或者尝试手动指定公共 DNS,如 Google 的 8.8.8.8 或阿里云的 223.5.5.5。 2.…

    2024年12月9日
    00
  • 在 WPF 中使用 Vlc.DotNet 和 LibVLCSharp.WPF 两种库来进行 VLC 的二次开发

    在 WPF 中使用 Vlc.DotNet 和 LibVLCSharp.WPF 两种库来进行 VLC 的二次开发,可以实现丰富的视频播放功能,比如播放本地视频、流媒体、控制播放、获取视频信息等功能。以下是对两者的介绍及开发步骤。 一、Vlc.DotNet 和 LibVLCSharp 的对比 特性 Vlc.DotNet LibVLCSharp.WPF 开发活跃度…

    2024年12月3日
    00

发表回复

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

联系我们

在线咨询: QQ交谈

邮件:723923060@qq.com

关注微信