爬虫反爬机制和解决方案

news2024/11/13 15:32:00

目录

      • 1. 爬虫与反爬机制简介
      • 2. 常见反爬机制及应对策略
      • 3. 反反爬实现:绕过反爬的技巧
      • 4. 案例代码实现:反反爬技巧应用
        • 案例 1:User-Agent轮换与代理池管理
        • 案例 2:验证码识别策略模式
        • 案例 3:限速装饰器模式
      • 5. 优化与实战:设计模式在反反爬中的应用

此文章将被分为五个主要部分,详细介绍爬虫绕过反爬机制的技术,代码采用面向对象思想,并为每个案例使用合适的设计模式。

1. 爬虫与反爬机制简介

在这部分,我们将介绍爬虫的基本概念,以及反爬机制的背景和意义,涵盖:

  • 爬虫的定义:爬虫是自动化的数据采集程序,模拟用户访问网站,以批量获取数据。
  • 反爬机制的起因:反爬机制主要目的是防止过度抓取,保护网站资源,保障合法用户的正常访问。
  • 常见的爬虫和反爬对抗历史:包括最简单的静态网页抓取、动态页面解析到复杂的反爬检测技术的进化。

通过该部分内容,可以帮助读者理解爬虫和反爬的来龙去脉,并为后续技术讲解打好基础。


2. 常见反爬机制及应对策略

这一部分深入介绍常见的反爬机制及其应对策略。每种机制都会介绍其工作原理及应对的策略。内容包括:

  • User-Agent检测:通过识别请求头中的User-Agent字段,判别访问是否来自自动化程序。

    • 绕过策略:使用随机的User-Agent库,以模拟不同浏览器的访问。
  • IP封禁与速率限制:服务器通过IP地址识别用户并进行封禁,限制访问速率。

    • 绕过策略:使用代理IP池,模拟多个用户访问。
  • JavaScript渲染检测:一些网页通过JavaScript动态渲染内容,以防止被简单的请求获取到数据。

    • 绕过策略:使用浏览器自动化工具如Selenium或Pyppeteer,模拟完整的浏览器行为。
  • 验证码机制:设置验证码以确认请求来自于真实用户。

    • 绕过策略:使用OCR技术(如Tesseract)或第三方验证码识别API绕过简单的图片验证码。
  • 请求频率控制(限速):检测用户的请求频率,超过一定频率后触发反爬。

    • 绕过策略:通过加入延时策略(如sleep)、分布式任务等方式控制请求速率。

在这部分,我们将分析每种反爬手段的优缺点及其适用场景。


3. 反反爬实现:绕过反爬的技巧

在这一部分中,讲解如何通过一些技巧和技术来绕过反爬机制。内容包括:

  • 代理池构建与管理:介绍如何通过第三方代理API或免费代理来源创建并管理一个IP池。可以使用工厂模式来管理代理对象。

  • 模拟浏览器行为:通过Selenium自动化测试工具,实现动态渲染。会介绍如何在Selenium中随机切换User-Agent并设置不同的浏览器指纹。

  • 请求头伪装:构建伪造的请求头,包括User-Agent、Referer、Cookie等字段,使请求尽量模拟真实用户。

  • 验证码绕过:使用Tesseract OCR识别验证码的思路,并通过策略模式实现不同类型验证码的识别策略,以提高通用性。

  • 限速控制与随机延迟:在多线程或异步爬虫中,利用延时控制访问频率。可以采用装饰器模式,以装饰器的方式给请求函数添加延时。

这部分的内容将为后续的代码实现奠定基础。


4. 案例代码实现:反反爬技巧应用

在这一部分中,我们会展示几个具体案例代码来演示反反爬技术,所有代码使用面向对象的思想,并为每个案例选择合适的设计模式。案例代码包括:

案例 1:User-Agent轮换与代理池管理

我们将创建一个 RequestHandler 类,采用工厂模式生成不同的请求代理,以实现轮换IP的需求。详细代码如下:

import requests
import random

class ProxyFactory:
    def __init__(self, proxy_list):
        self.proxy_list = proxy_list

    def get_proxy(self):
        return random.choice(self.proxy_list)

class RequestHandler:
    def __init__(self, proxy_factory):
        self.proxy_factory = proxy_factory
        self.user_agents = [
            "Mozilla/5.0 ...",
            "Mozilla/4.0 ...",
            # 更多User-Agent
        ]

    def get(self, url):
        headers = {"User-Agent": random.choice(self.user_agents)}
        proxy = {"http": self.proxy_factory.get_proxy()}
        response = requests.get(url, headers=headers, proxies=proxy)
        return response

# 测试代码
proxy_factory = ProxyFactory(["http://proxy1", "http://proxy2"])
handler = RequestHandler(proxy_factory)
print(handler.get("http://example.com").text)
案例 2:验证码识别策略模式

为了解决不同验证码格式的问题,我们将使用策略模式定义不同的验证码识别方式。

from abc import ABC, abstractmethod
from PIL import Image
import pytesseract

class CaptchaSolver(ABC):
    @abstractmethod
    def solve(self, image):
        pass

class OCRSolver(CaptchaSolver):
    def solve(self, image):
        return pytesseract.image_to_string(image)

class SimpleSolver(CaptchaSolver):
    def solve(self, image):
        # 简单的灰度化和二值化处理
        processed_image = image.convert("L")
        return pytesseract.image_to_string(processed_image)

class CaptchaHandler:
    def __init__(self, solver: CaptchaSolver):
        self.solver = solver

    def solve_captcha(self, image_path):
        image = Image.open(image_path)
        return self.solver.solve(image)

# 测试代码
solver = OCRSolver()
captcha_handler = CaptchaHandler(solver)
print(captcha_handler.solve_captcha("captcha.png"))
案例 3:限速装饰器模式

为了避免频繁访问触发限速,我们可以使用装饰器模式在每次请求前加入随机延迟。

import time
import random

def rate_limit(func):
    def wrapper(*args, **kwargs):
        time.sleep(random.uniform(1, 3))  # 随机延迟1到3秒
        return func(*args, **kwargs)
    return wrapper

class Scraper:
    @rate_limit
    def fetch_data(self, url):
        # 模拟网络请求
        print(f"Fetching {url}")
        # 实际请求代码
        return "page content"

# 测试代码
scraper = Scraper()
print(scraper.fetch_data("http://example.com"))

5. 优化与实战:设计模式在反反爬中的应用

在最后一部分,我们总结这些代码中的设计模式及其在爬虫中的应用场景,包括:

  • 工厂模式:用于创建和管理代理对象池,灵活地生成代理请求。
  • 策略模式:在验证码识别中应用不同的识别策略,便于拓展新的识别方式。
  • 装饰器模式:对请求函数进行限速控制,防止频繁访问导致封禁。

我们还会讲解如何优化爬虫性能,并分析设计模式的优势,例如提升代码的扩展性和可维护性。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2239480.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习入门】(1) 线性回归算法

学习目标: 线性回归是一种基本的统计学习方法,主要用于分析一个或多个自变量与因变量之间的线性关系。以下是关于线性回归的一些关键点:线性回归的四要素: (1)假设(hypothesis);(2&…

视频会议接入GB28181视频指挥调度,语音对讲方案

传统的视频会议指挥调度系统目前主流的互联网会议大部分都是私有协议,功能都很独立。目前主流的视频监控国标都最GB平台,新的需求要求融合平台要接入监控等设备,并能实现观看监控接入会议,实时语音设备指挥现场工作人员办公实施。…

一文1800字使用Jmeter进行http接口性能测试!

接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。 为什么要做接口测试? 越底层发现b…

搭建监控系统Prometheus + Grafana

公司有个技术分享会,但是业务忙,没时间精心准备,所以就匆匆忙忙准备分享一下搭建(捂脸哭)。技术含量确实不多,但是分享的知识确实没问题。 以下是搭建过程: 一、讲解 Prometheus Prometheus 最…

ArkTS中的自定义构建函数、Tab栏和组件状态共享

一、自定义构建函数 1.构建函数 Builder 1.1 介绍 文档地址:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-builder-V5?catalogVersionV5 概念:ArkUI提供了一种轻量的UI元素复用机制Builder,可以将重复使用的U…

二维、三维情况下的锚点优选方法

多锚点定位时,锚点的选择对定位精度有重要影响。下面介绍基于误差最小化的锚点选择的相应公式和MATLAB代码示例,并进行详细分析 文章目录 方法描述代码MATLAB代码示例代码运行结果 总结 方法描述 选择能够最小化定位误差的锚点组合。通过计算锚点位置与…

CCF ChinaOSC |「开源科学计算与系统建模openSCS专题分论坛」11月9日与您相约深圳

2024年11月9日至10日,以“湾区聚力 开源启智”为主题的2024年中国计算机学会中国开源大会(CCF ChinaOSC)将在深圳召开。大会将汇聚国内外学术界、顶尖科技企业、科研机构及开源社区的精英力量,共同探索人工智能技术和人类智慧的无…

力扣102:二叉树的层次遍历

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]]示例 2: 输入&a…

数学建模模型算法-Python实现

一、评价决策类 1、层次分析法(AHP) 层次分析法用来评价或选择一个更好更优的决策或方案 通过找到可以衡量其好坏的指标,进而衡量指标,再形成评价体系 归一化处理 让指标在同一数量级,且保证在同一指标下其差距保持…

linux-vlan(1)

# VLAN # 1.topo # 2.创建命名空间 ip netns add ns1 ip netns add ns2 ip netns add ns3 # 3.创建veth设备 ip link add ns1-veth0 type veth peer name ns21-veth0 ip link add ns3-veth0 type veth peer name ns23-veth0 # 4.veth设备放入命名空间,启动接口 ip link set n…

spring cloud 入门笔记1(RestTemplate,Consul)

最大感受: spring cloud无非是将spring boot中的各个工作模块拆分成独立的小spring boot,各个模块之间,不再是通过导包什么的,调用而是通过网路进行各个模块之间的调用 工具一:RestTemplate 在Java代码中发送HTTP请…

FlinkSql读取kafka数据流的方法(scala)

我的scala版本为2.12 <scala.binary.version>2.12</scala.binary.version> 我的Flink版本为1.13.6 <flink.version>1.13.6</flink.version> FlinkSql读取kafka数据流需要如下依赖&#xff1a; <dependency><groupId>org.apache.flink&…

Docker 安装Immich教程

Immich 是一个开源的自托管照片和视频管理平台,专为帮助用户存储、管理、和分享个人媒体库而设计。Immich 的目标是提供一个类似 Google Photos 的替代方案,但不依赖于第三方服务,用户可以完全控制自己的数据。 本章教程,记录如何用Docker部署安装Immich,使用的操作系统的…

【CICD】CICD 持续集成与持续交付在测试中的应用

一、什么是CICD&#xff1f; CI/CD 是指持续集成&#xff08;Continuous Integration&#xff09;和持续部署&#xff08;Continuous Deployment&#xff09;或持续交付&#xff08;Continuous Delivery&#xff09; 1.1 持续集成&#xff08;Continuous Integration&#xf…

交友问题 | 动态规划

描述 如果有n个人&#xff0c;每个人都可以保持单身或与其他人结成一对。每个人只能找一个对象。求总共有多少种保持单身或结对的方式。用动态规划求解。 输入 输入第一行t表示测试用例的数量 对于每一个测试用例, 输入一个整数n表示人数1<n<18 输出 针对每个测试用…

Web开发:ABP框架6——appsetting.json的读取以及实例的注入

目录 一、模块配置服务 二、配置服务的编写&#xff08;配置ORM&#xff09; 三、高层代码的运用&#xff08;ORM实例查询 & 获取字符串&#xff09; 一、模块配置服务 BookStoreHttpApiHostModule 二、配置服务的编写&#xff08;配置ORM&#xff09; (以freesql为例子…

tomcat启动运行乱码,解决方案

tomcat启动运行乱码,解决方案 不要修改系统设置;我们是要让tomcat兼容我们系统,不是让系统兼容tomcat。不要修改系统设置;我们是要让tomcat兼容我们系统,不是让系统兼容tomcat。不要修改系统设置;我们是要让tomcat兼容我们系统,不是让系统兼容tomcat。解决方案 找到你的…

UE5材质篇 3 MaterialFunction

这个可以避免一部分的蜘蛛网&#xff0c;这样就用的时候很多蜘蛛网缩小成为一个节点 https://dev.epicgames.com/documentation/en-us/unreal-engine/creating-and-using-material-functions-in-unreal-engine 首先创建一个&#xff0c;这里这个名字他就是函数名&#xff0c;后…

linux命令详解,文件系统权限相关

文件系统权限相关 linux系统中一切都是文件 查看权限 Is -la /etc/passwd更改文件所有者 chown root file修改文件权限 sudo chmod urwx,grw,o-r file sudo chmod ux,gtw,o-r file chmod 400 <file>一、Linux系统中一切都是文件 在linux系统中&#xff0c;几乎所有的…

基本数据类型和包装类型的区别、缓存池、自动拆箱装箱(面试题)

目录 1. 八种基本类型及对应包装类型 2. 基本类型和包装类型 区别 3. 自动拆箱装箱 3.1 自动装箱 3.2 自动拆箱 3.3 缓存池 4. 高频面试案例分析 1. 八种基本类型及对应包装类型 基本数据类型类型描述范围&#xff08;指数形式&#xff09;位数包装类型byte整型&#x…