自动化采集脚本与隧道IP防封设计
最近群里讨论问如何编写一个自动化采集脚本,要求使用隧道IP(代理IP池)来防止IP被封。这样的脚本通常用于爬虫或数据采集任务,其中目标网站可能会因为频繁的请求而封禁IP。对于这些我还是有些经验的。
核心思路:
1、使用代理IP池(隧道IP)来轮换IP,使得每次请求使用不同的IP地址,降低被封的风险。
2、自动化采集脚本需要能够处理请求失败的情况(比如IP失效、请求超时等),并自动切换代理重试。
3、设置合理的请求间隔,避免过于频繁的请求。
我们将使用Python语言,并借助一些库来实现:- requests: 发送HTTP请求。
使用代理隧道:通常隧道服务商会提供一个固定的入口地址(比如代理隧道服务(炎帝云)),我们只需要在请求时设置代理即可。隧道服务会自动更换出口IP。
要设计一个结合隧道IP实现防封的自动化采集脚本,需从IP管理、请求策略、异常处理等维度进行系统设计。以下是完整解决方案:
一、核心架构设计
二、关键组件实现
1. 隧道IP管理器
import requestsclass TunnelManager:def __init__(self, tunnel_url, auth_key):self.tunnel_url = tunnel_urlself.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 Retryclass SmartRequester:def __init__(self, tunnel_manager):self.tunnel = tunnel_managerself.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()continuereturn respexcept Exception as e:self.tunnel.rotate_tunnel()def _is_blocked(self, response):"""封禁特征检测"""if response.status_code in [403, 429, 418]:return Trueif "captcha" in response.text.lower():return Trueif len(response.content) < 512: # 异常小页面return Truereturn False
3. 主采集脚本示例
from bs4 import BeautifulSoupclass 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 = 1while 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 += 1def save_to_db(self, data):# 数据库存储实现pass
三、进阶防封策略
-
指纹伪装技术
# 在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, ...)
-
流量模式混淆
# 随机化请求行为 actions = ['scroll', 'click', 'wait'] if random.random() > 0.7:self._simulate_human(random.choice(actions))
-
分布式架构
四、隧道服务推荐
-
专业服务商
- Luminati(高端)
- Oxylabs(企业级)
- Smartproxy(性价比)
-
自建方案
# 使用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验证 | 触发人工干预流程 | 切换采集策略 |
最终建议:
- 优先选用按请求计费的隧道服务
- 关键业务部署双隧道热备方案
- 每周更新User-Agent池
- 使用Headless Browser处理动态反爬
总体来说,只要是完整得系统且配合Prometheus监控+告警模块,当封禁率>5%时自动触发策略调整。
上面就是有关我部署的全部话题,如果大家有更好的建议可以留言告诉我。
相关文章:

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

【设计模式-4.7】行为型——备忘录模式
说明:本文介绍行为型设计模式之一的备忘录模式 定义 备忘录模式(Memento Pattern)又叫作快照模式(Snapshot Pattern)或令牌模式(Token Pattern)指在不破坏封装的前提下,捕获一个对…...

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

Vert.x学习笔记-Verticle原理解析
Vert.x学习笔记 一、设计理念:事件驱动的组件化模型二、生命周期管理三、部署方式与策略四、通信机制:事件总线(Event Bus)五、底层实现原理六、典型应用场景七、Verticle与EventLoop的关系1、核心关系:一对一绑定与线…...
Cobra CLI 工具使用指南:构建 Go 语言命令行应用的完整教程
Cobra CLI 工具使用指南:构建 Go 语言命令行应用的完整教程 在 Go 语言开发中,构建功能强大的命令行界面(CLI)应用是常见需求。Cobra 作为 Go 生态中最受欢迎的 CLI 库,凭借其灵活的设计和丰富的功能,成为…...

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

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

强化学习鱼书(10)——更多深度强化学习的算法
:是否使用环境模型(状态迁移函数P(s’|s,a)和奖 励函数r(s,a,V))。不使用环境模型的方法叫作无模型(model-free)的方法,使用环境模型的方法叫作有模型(model-based&#…...

K8S上使用helm部署 Prometheus + Grafana
一、使用 Helm 安装 Prometheus 1. 配置源 地址: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…...
十四、【测试执行篇】让测试跑起来:API 接口测试执行器设计与实现 (后端执行逻辑)
@[TOC](【测试执行篇】让测试跑起来:API 接口测试执行器设计与实现 (后端执行逻辑)) 前言 测试执行是测试平台的核心价值所在。一个好的测试执行器需要能够: 准确解析测试用例: 正确理解用例中定义的请求参数和断言条件。可靠地发送请求: 模拟真实的客户端行为与被测 API…...

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架构全解析:从核心原理到企业级实践
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「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分别…...
快速了解GO+ElasticSearch
更多个人笔记见: (注意点击“继续”,而不是“发现新项目”) github个人笔记仓库 https://github.com/ZHLOVEYY/IT_note gitee 个人笔记仓库 https://gitee.com/harryhack/it_note 个人学习,学习过程中还会不断补充&…...

定制开发开源AI智能名片驱动下的海报工厂S2B2C商城小程序运营策略——基于社群口碑传播与子市场细分的实证研究
摘要 本文聚焦“定制开发开源AI智能名片S2B2C商城小程序”技术与海报工厂业务的融合实践,探讨其如何通过风格化海报矩阵的精细化开发、AI技术驱动的用户体验升级,以及S2B2C模式下的社群裂变机制,实现“工具功能-社交传播-商业变现”的生态…...

【Unity开发】控制手机移动端的震动
🐾 个人主页 🐾 阿松爱睡觉,横竖醒不来 🏅你可以不屠龙,但不能不磨剑🗡 目录 一、前言二、Unity的Handheld.Vibrate()三、调用Android原生代码四、NiceVibrations插件五、DeviceVibration插件六、控制游戏手…...
JAVA中的注解和泛型
目录 JAVA注解介绍 概念 注解的本质 4种标准元注解 自定义注解 泛型介绍 泛型的定义 JAVA泛型 泛型方法( ) 泛型类( ) 类型通配符 类型擦除 JAVA注解介绍 概念 注解是 JDK 5.0 引入的一种元数据机制,用来对代码进行标注。它不会影…...

Cesium快速入门到精通系列教程二:添加地形与添加自定义地形、相机控制
一、添加地形与添加自定义地形 在 Cesium 1.93 中添加地形可以通过配置terrainProvider实现。Cesium 支持多种地形数据源,包括 Cesium Ion 提供的全球地形、自定义地形服务以及开源地形数据。下面介绍几种常见的添加地形的方法: 使用 Cesium Ion 全球地…...
汽车零配件---ecu开发工厂学习
ecu成品制作工艺流程 一、PCB 设计与制作(打板) 工艺流程步骤 需求分析与电路设计 根据 ECU 功能(如发动机控制、变速箱控制)确定所需芯片(如 MCU、传感器接口芯片)、外围电路(如电源、通信接…...

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

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

windows安装多个版本composer
一、需求场景 公司存在多个项目,有的项目比较老,需要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…...

贪心算法应用:边着色问题详解
贪心算法应用:边着色问题详解 贪心算法是一种在每一步选择中都采取当前状态下最优的选择,从而希望导致结果是全局最优的算法策略。边着色问题是图论中的一个经典问题,贪心算法可以有效地解决它。下面我将从基础概念到具体实现,全…...
【蓝桥杯】包子凑数
包子凑数 题目描述 小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有 NN 种蒸笼,其中第 ii 种蒸笼恰好能放 AiAi 个包子。每种蒸笼都有非常多笼,可以认为是无限笼。 每当有顾客想买 XX 个包子,卖包子的大叔就会迅速选出若干…...

ck-editor5的研究 (2):对 CKEditor5 进行设计,并封装成一个可用的 vue 组件
前言 在上一篇文章中—— ck-editor5的研究(1):快速把 CKEditor5 集成到 nuxt 中 ,我仅仅是把 ckeditor5 引入到了 nuxt 中,功能还不算通用。 这一篇内容将会对其进行设计,并封装成可复用的 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数据库表设…...

simulink mask、sfunction和tlc的联动、接口
这里全部是讲的level2 sfunction(用m语言编写),基于matlab 2020a。 1.mask的参数操作 1)mask通过set_param和get_param这2个函数接口对mask里面定义的Parameters&Dialog的参数的大部分属性进行读写,一般是Value值…...

VMWare安装常见问题
如果之前安装过VMWare软件,只要是 15/16 版本的,可以正常使用的,不用卸载!!! 如果之前安装过,卸载了,一定要保证通过正常的渠道去卸载(通过控制面板卸载软件)…...
set_property LOC约束
##下列指令是用于清除自带GT CELL相关的LOC约束,或者覆盖 ##你需要把IP中自带的GT cell相关的LOC约束清除掉,或者覆盖掉 ##以下命令可以用来覆盖GT_CHANNEL的LOC约束, 在这条命令之后执行你自己的physical constraint: ##GT的channel的相关管脚有两种设计…...