自动化采集脚本与隧道IP防封设计

news2025/6/6 18:01:23

最近群里讨论问如何编写一个自动化采集脚本,要求使用隧道IP(代理IP池)来防止IP被封。这样的脚本通常用于爬虫或数据采集任务,其中目标网站可能会因为频繁的请求而封禁IP。对于这些我还是有些经验的。

在这里插入图片描述

核心思路:

1、使用代理IP池(隧道IP)来轮换IP,使得每次请求使用不同的IP地址,降低被封的风险。

2、自动化采集脚本需要能够处理请求失败的情况(比如IP失效、请求超时等),并自动切换代理重试。

3、设置合理的请求间隔,避免过于频繁的请求。

我们将使用Python语言,并借助一些库来实现:- requests: 发送HTTP请求。

使用代理隧道:通常隧道服务商会提供一个固定的入口地址(比如代理隧道服务(炎帝云)),我们只需要在请求时设置代理即可。隧道服务会自动更换出口IP。

要设计一个结合隧道IP实现防封的自动化采集脚本,需从IP管理、请求策略、异常处理等维度进行系统设计。以下是完整解决方案:

一、核心架构设计

采集脚本
隧道IP管理器
代理IP池
请求控制模块
异常处理
数据存储

二、关键组件实现

1. 隧道IP管理器
import requests

class TunnelManager:
    def __init__(self, tunnel_url, auth_key):
        self.tunnel_url = tunnel_url
        self.headers = {'Proxy-Authorization': f'Bearer {auth_key}'}
        
    def get_proxy(self):
        """获取动态隧道IP"""
        "free" //提取链接:https://www.yandiyun.com/customer/register/255SG48I/
        try:
            resp = requests.get(f"{self.tunnel_url}/get_proxy", headers=self.headers)
            return resp.json()['proxy']  # 格式:'http://ip:port'
        except Exception as e:
            self.rotate_tunnel()  # 故障时切换隧道
            return self.get_proxy()
    
    def rotate_tunnel(self):
        """强制更换出口IP"""
        requests.get(f"{self.tunnel_url}/rotate", headers=self.headers)
2. 智能请求控制模块
import random
import time
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

class SmartRequester:
    def __init__(self, tunnel_manager):
        self.tunnel = tunnel_manager
        self.session = requests.Session()
        
        # 自动重试配置
        retry_strategy = Retry(
            total=3,
            backoff_factor=0.5,
            status_forcelist=[429, 500, 502, 503, 504],
            allowed_methods=["GET", "POST"]
        )
        self.session.mount('https://', HTTPAdapter(max_retries=retry_strategy))
    
    def request(self, url, method='GET', **kwargs):
        while True:
            proxy = {'https': self.tunnel.get_proxy()}
            try:
                # 智能延时(动态调整请求间隔)
                time.sleep(random.uniform(1.5, 4.0))
                
                resp = self.session.request(
                    method, 
                    url,
                    proxies=proxy,
                    timeout=15,
                    **kwargs
                )
                
                # 触发封禁检测(关键!)
                if self._is_blocked(resp):
                    self.tunnel.rotate_tunnel()
                    continue
                    
                return resp
                
            except Exception as e:
                self.tunnel.rotate_tunnel()
    
    def _is_blocked(self, response):
        """封禁特征检测"""
        if response.status_code in [403, 429, 418]:
            return True
        if "captcha" in response.text.lower():
            return True
        if len(response.content) < 512:  # 异常小页面
            return True
        return False
3. 主采集脚本示例
from bs4 import BeautifulSoup

class DataCollector:
    def __init__(self):
        self.requester = SmartRequester(
            TunnelManager(
                tunnel_url="https://api.tunnelservice.com/v1",
                auth_key="YOUR_AUTH_KEY"
            )
        )
    
    def scrape(self, base_url):
        page = 1
        while True:
            url = f"{base_url}?page={page}"
            response = self.requester.request(url)
            
            if response.status_code == 404:  # 终止条件
                break
                
            # 解析数据
            soup = BeautifulSoup(response.text, 'lxml')
            items = soup.select('.product-item')
            
            for item in items:
                data = {
                    'name': item.select_one('.title').text.strip(),
                    'price': item.select_one('.price').text
                }
                self.save_to_db(data)
            
            page += 1
    
    def save_to_db(self, data):
        # 数据库存储实现
        pass

三、进阶防封策略

  1. 指纹伪装技术

    # 在SmartRequester的request方法中添加:
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
        'Accept-Language': 'en-US,en;q=0.9',
        'Sec-Fetch-Dest': 'document'
    }
    resp = self.session.request(..., headers=headers, ...)
    
  2. 流量模式混淆

    # 随机化请求行为
    actions = ['scroll', 'click', 'wait']
    if random.random() > 0.7:
        self._simulate_human(random.choice(actions))
    
  3. 分布式架构

    调度中心
    采集节点1
    采集节点2
    隧道集群1
    隧道集群2

四、隧道服务推荐

  1. 专业服务商

    • Luminati(高端)
    • Oxylabs(企业级)
    • Smartproxy(性价比)
  2. 自建方案

    # 使用Squid搭建隧道
    sudo apt install squid
    # 配置/etc/squid/squid.conf:
    visible_hostname tunnel-proxy
    forwarded_for delete
    via off
    

五、异常处理矩阵

错误类型处理方案恢复策略
429 Too Many Req立即切换IP+指数退避等待2^n秒后重试
403 Forbidden更换UserAgent+清空Cookies切换业务指纹
连接超时标记失效代理+快速切换自动隔离故障节点
CAPTCHA验证触发人工干预流程切换采集策略

最终建议

  1. 优先选用按请求计费的隧道服务
  2. 关键业务部署双隧道热备方案
  3. 每周更新User-Agent池
  4. 使用Headless Browser处理动态反爬

总体来说,只要是完整得系统且配合Prometheus监控+告警模块,当封禁率>5%时自动触发策略调整。

上面就是有关我部署的全部话题,如果大家有更好的建议可以留言告诉我。

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

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

相关文章

【设计模式-4.7】行为型——备忘录模式

说明&#xff1a;本文介绍行为型设计模式之一的备忘录模式 定义 备忘录模式&#xff08;Memento Pattern&#xff09;又叫作快照模式&#xff08;Snapshot Pattern&#xff09;或令牌模式&#xff08;Token Pattern&#xff09;指在不破坏封装的前提下&#xff0c;捕获一个对…

docker离线镜像下载

背景介绍 在某些网络受限的环境中&#xff0c;直接从Docker Hub或其他在线仓库拉取镜像可能会遇到困难。为了在这种情况下也能顺利使用Docker镜像&#xff0c;我们可以提前下载好所需的镜像&#xff0c;并通过离线方式分发和使用。 当前镜像有&#xff1a;python-3.8-slim.ta…

Vert.x学习笔记-Verticle原理解析

Vert.x学习笔记 一、设计理念&#xff1a;事件驱动的组件化模型二、生命周期管理三、部署方式与策略四、通信机制&#xff1a;事件总线&#xff08;Event Bus&#xff09;五、底层实现原理六、典型应用场景七、Verticle与EventLoop的关系1、核心关系&#xff1a;一对一绑定与线…

jQuery和CSS3卡片列表布局特效

这是一款jQuery和CSS3卡片列表布局特效。该卡片布局使用owl.carousel.js来制作轮播效果&#xff0c;使用简单的css代码来制作卡片布局&#xff0c;整体效果时尚大方。 预览 下载 使用方法 在页面最后引入jquery和owl.carousel.js相关文件。 <link rel"stylesheet&qu…

不连网也能跑大模型?

一、这是个什么 App&#xff1f; 你有没有想过&#xff0c;不用连网&#xff0c;你的手机也能像 ChatGPT 那样生成文字、识别图片、甚至回答复杂问题&#xff1f;Google 最近悄悄发布了一个实验性 Android 应用——AI Edge Gallery&#xff0c;就是为此而生的。 这个应用不在…

强化学习鱼书(10)——更多深度强化学习的算法

&#xff1a;是否使用环境模型&#xff08;状态迁移函数P(s’|s,a)和奖 励函数r(s&#xff0c;a&#xff0c;V)&#xff09;。不使用环境模型的方法叫作无模型&#xff08;model-free&#xff09;的方法&#xff0c;使用环境模型的方法叫作有模型&#xff08;model-based&#…

K8S上使用helm部署 Prometheus + Grafana

一、使用 Helm 安装 Prometheus 1. 配置源 地址&#xff1a;prometheus 27.19.0 prometheus/prometheus-community # 添加repo $ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts "prometheus-community" has been added…

Java面试八股--07-项目篇

致谢:2025年 Java 面试八股文(20w字)_java面试八股文-CSDN博客 目录 1、介绍一下最近做的项目 1.1 项目背景: 1.2 项目功能 1.3 技术栈 1.4自己负责的功能模块 1.5项目介绍参考: 1.6整体业务介绍: 1.8后台管理系统功能: 1.8.1后台主页: 1.8.2 商品模块: 1.8…

MCP架构全解析:从核心原理到企业级实践

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…

从0到1认识EFK

一、ES集群部署 操作系统Ubuntu22.04LTS/主机名IP地址主机配置elk9110.0.0.91/244Core8GB100GB磁盘elk9210.0.0.92/244Core8GB100GB磁盘elk9310.0.0.93/244Core8GB100GB磁盘 1. 什么是ElasticStack? # 官网 https://www.elastic.co/ ElasticStack早期名称为elk。 elk分别…

定制开发开源AI智能名片驱动下的海报工厂S2B2C商城小程序运营策略——基于社群口碑传播与子市场细分的实证研究

摘要 本文聚焦“定制开发开源AI智能名片S2B2C商城小程序”技术与海报工厂业务的融合实践&#xff0c;探讨其如何通过风格化海报矩阵的精细化开发、AI技术驱动的用户体验升级&#xff0c;以及S2B2C模式下的社群裂变机制&#xff0c;实现“工具功能-社交传播-商业变现”的生态…

【Unity开发】控制手机移动端的震动

&#x1f43e; 个人主页 &#x1f43e; 阿松爱睡觉&#xff0c;横竖醒不来 &#x1f3c5;你可以不屠龙&#xff0c;但不能不磨剑&#x1f5e1; 目录 一、前言二、Unity的Handheld.Vibrate()三、调用Android原生代码四、NiceVibrations插件五、DeviceVibration插件六、控制游戏手…

Cesium快速入门到精通系列教程二:添加地形与添加自定义地形、相机控制

一、添加地形与添加自定义地形 在 Cesium 1.93 中添加地形可以通过配置terrainProvider实现。Cesium 支持多种地形数据源&#xff0c;包括 Cesium Ion 提供的全球地形、自定义地形服务以及开源地形数据。下面介绍几种常见的添加地形的方法&#xff1a; 使用 Cesium Ion 全球地…

python学习打卡day43

DAY 43 复习日 作业&#xff1a; kaggle找到一个图像数据集&#xff0c;用cnn网络进行训练并且用grad-cam做可视化 浙大疏锦行 数据集使用猫狗数据集&#xff0c;训练集中包含猫图像4000张、狗图像4005张。测试集包含猫图像1012张&#xff0c;狗图像1013张。以下是数据集的下…

Microsoft Word使用技巧分享(本科毕业论文版)

小铃铛最近终于完成了毕业答辩后空闲下来了&#xff0c;但是由于学校没有给出准确地参考模板&#xff0c;相信诸位朋友们也在调整排版时感到头疼&#xff0c;接下来小铃铛就自己使用到的一些排版技巧分享给大家。 注&#xff1a;以下某些设置是根据哈尔滨工业大学&#xff08;威…

windows安装多个版本composer

一、需求场景 公司存在多个项目&#xff0c;有的项目比较老&#xff0c;需要composer 1.X版本才能使用 新的项目又需要composer 2.X版本才能使用 所以需要同时安装多个版本的composer二、下载多个版本composer #composer官网 https://getcomposer.org/download/三、放到指定目…

【办公类-22-05】20250601Python模拟点击鼠标上传CSDN12篇

、 背景需求: 每周为了获取流量券,每天上传2篇,获得1500流量券,每周共上传12篇,才能获得3000和500的券。之前我用UIBOT模拟上传12篇。 【办公类-22-04】20240418 UIBOT模拟上传每天两篇,获取流量券,并删除内容_csdn 每日任务流量券-CSDN博客文章浏览阅读863次,点赞18…

贪心算法应用:边着色问题详解

贪心算法应用&#xff1a;边着色问题详解 贪心算法是一种在每一步选择中都采取当前状态下最优的选择&#xff0c;从而希望导致结果是全局最优的算法策略。边着色问题是图论中的一个经典问题&#xff0c;贪心算法可以有效地解决它。下面我将从基础概念到具体实现&#xff0c;全…

ck-editor5的研究 (2):对 CKEditor5 进行设计,并封装成一个可用的 vue 组件

前言 在上一篇文章中—— ck-editor5的研究&#xff08;1&#xff09;&#xff1a;快速把 CKEditor5 集成到 nuxt 中 &#xff0c;我仅仅是把 ckeditor5 引入到了 nuxt 中&#xff0c;功能还不算通用。 这一篇内容将会对其进行设计&#xff0c;并封装成可复用的 vue 组件&…

Java-redis实现限时在线秒杀功能

1.使用redisson pom文件添加redisson <!--redisson--><dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.23.4</version></dependency> 2.mysql数据库表设…