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

相关推荐

  • HTTP POST/GET 接口测试工具是开发和测试

    HTTP POST/GET 接口测试工具是开发和测试网络应用时必不可少的工具,用于验证 HTTP 请求的正确性、响应的状态和数据格式。以下是常用的 HTTP 接口测试工具及其功能介绍。 1. 常用的 HTTP 接口测试工具 1.1 Postman Postman 是目前最流行的 API 测试工具,适用于 RESTful 和 GraphQL 接口的测试。 功能…

    2024年11月25日
    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
  • 微信小程序获取图片网页链接转换为 base64 ,wx.arrayBufferToBase64(binary) 提示已弃用的处理方法

    微信小程序中 wx.arrayBufferToBase64 提示已弃用的问题,可以通过其他方式实现将图片网页链接转换为 Base64 文件。以下是几种替代方法和完整的实现方案。 1. 问题分析wx.arrayBufferToBase64 在较新版本的小程序中可能会提示已弃用,建议开发者使用 JavaScript 原生方式处理。如果目标是将网络图片转换为 Ba…

    2024年11月28日
    00
  • JavaScript 前端开发:从入门到精通的方法

    JavaScript 是前端开发的核心语言,它与 HTML 和 CSS 一起构成了 Web 开发的基础。要从入门到精通 JavaScript 前端开发,需要系统化的学习方法和实践。以下是详细的方法和步骤。 1. 理解 JavaScript 的基础 1.1 学习基础语法 1.2 理解函数 箭头函数: 1.3 掌握 DOM 操作 修改内容: 监听事件: 1.4 …

    2024年11月22日
    00
  • 在 Go 语言中,对文件的基础操作介绍

    在 Go 语言中,文件操作是基础技能之一,主要通过 os、io 和 io/ioutil 等标准库完成。以下是对文件操作的全面介绍,帮助你在 Go 语言的“成神之路”上迈出关键一步! 1. 创建文件使用 os.Create 创建文件,如果文件已存在会被清空。示例代码 2. 打开文件使用 os.Open 打开文件(只读模式),使用 os.OpenFile 可以指…

    2024年12月2日
    00
  • uni-app 一个使用 Vue.js 开发所有前端应用的框架跨端开发的优势

    uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到 iOS、Android、Web(响应式)、以及各种小程序(微信 / 支付宝 / 百度 / 头条 / QQ / 钉钉)等多个平台,其跨端开发具有以下优势: 开发效率高 跨平台兼容性好 性能优化 生态丰富 学习成本低

    2024年12月22日
    00
  • 通过 PHP 读取微软邮箱(Outlook/Office 365 邮箱)

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

    2024年11月25日
    00
  • 在 Ant Design ProTable 中,如何设置不分页,依然显示分页信息,前端分页不触发

    在 Ant Design ProTable 中,默认情况下,分页是与数据请求(request)相关联的。也就是说,每当分页切换时,request 会被触发,重新请求新的数据。如果你希望在禁用分页的同时,依然显示分页控件,并且不触发 request 请求,可以通过以下方法进行配置。解决方案要在 Ant Design ProTable 中禁用分页的同时保留分页信…

    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
  • 在 React Native 0.72.5 中使用 Hermes 引擎时JavaScript 的 Function.prototype.toString() 转成字符串

    在 React Native 0.72.5 中,使用 Hermes 引擎时,JavaScript 的 Function.prototype.toString() 方法的行为可能与其他 JavaScript 引擎(如 V8 或 JavaScriptCore)有所不同。这种差异源于 Hermes 的设计,旨在提升性能和减少内存开销。 问题描述 在 Hermes …

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

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

    2024年11月28日
    00
  • 浏览器跨域请求中携带 Cookie需要同时在前端和后端进行配置

    浏览器跨域请求中,要让请求携带 Cookie,需要同时在前端和后端进行配置。以下是实现的方法: 前端配置 在前端代码中使用 fetch 或 Axios 发起请求时,需要设置 credentials 属性: 1. Fetch 示例 2. Axios 示例 后端配置 在后端需要允许跨域请求,并确保 Cookie 能够正常传递。 1. 设置 Access-Cont…

    2024年12月9日
    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
  • 2024最新版 Anaconda 安装方法

    Anaconda 是一个非常流行的数据科学与机器学习平台,包含 Python、常用库、以及环境管理工具 Conda。以下是 2024 年最新版 Anaconda 的安装步骤。 1. 下载 Anaconda 下载地址 2. 安装步骤 Windows 系统 MacOS 系统 Linux 系统 打开终端,定位到下载目录: 运行安装脚本: 执行安装脚本: 许可协议:…

    2024年11月21日
    00
  • Flutter 在 PC 端多窗口支持方面的进展备受关注的功能,已在 Ubuntu/Canonical 展示

    Flutter 在 PC 端多窗口支持方面的进展是一个备受关注的功能,它的目标是进一步提升 Flutter 的跨平台能力。最近,Flutter 团队与 Canonical 合作,在 Ubuntu 平台上展示了多窗口功能的新成果。这一进展对开发者和终端用户来说都有重要意义,以下是相关细节分析: 展示细节多窗口功能亮相Flutter 的多窗口支持在 Ubuntu…

    2024年12月2日
    00

发表回复

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

联系我们

在线咨询: QQ交谈

邮件:723923060@qq.com

关注微信