爬虫频繁被封 IP?从原因定位到接入动态代理的完整实操
2026/6/24 2:19:02 网站建设 项目流程

做数据采集的人多半都遇到过:脚本前几百个请求跑得好好的,突然开始大面积返回 403、429,或者目标站直接弹验证码、返回空数据。很多人第一反应是用代理试试看,但买了发现没解决,或者好两天又复发。

这篇把整个链路讲清楚:先判断到底是不是 IP 的问题,再讲什么场景该用哪种代理、怎么对接、怎么验证它真的有效。文末附可复现的代码。

一、怎么判断是不是 IP 被封了?

被封不一定是 IP 的锅。常见触发封禁的因素有几类:

  • 请求频率过高或过于规律——同一 IP 短时间打太多请求,节奏机械

  • IP 信誉差——这个 IP 之前被人滥用过,已经进了目标站或第三方信誉库的黑名单

  • 请求指纹异常——User-Agent、Header 顺序、TLS 指纹、缺 Cookie,一看就是脚本

  • 行为特征不像真人——不加载 JS、访问路径异常、踩中蜜罐链接

快速定位:把同一个请求,换一条干净网络(比如手机热点)手动跑一次。

  • 换 IP 就正常 → 是 IP 维度的问题,代理能帮上忙

  • 换 IP 还是被拦 → 是频率、指纹或行为问题,光换 IP 没用,得先改这些

这一步很多人跳过,结果钱花在代理上、病根在指纹上。

二、短效代理和隧道代理,该怎么选?

确认是 IP 问题后,主流方案是用动态代理让出口 IP 轮换。常见两种形态:

短效代理:服务商给你一个提取接口,你一次拉一批ip:port,在客户端自己管理和轮换,IP 有效期通常几分钟。适合需要精细控制 IP 分配、并发量大的场景。

隧道代理:你只对接一个固定的隧道地址,每个请求由服务端自动换出口 IP,客户端不用维护 IP 池。实现得好的隧道服务在某个出口 IP 失效时会自动转发到下一个可用 IP,这层重试由服务端兜底,客户端能省掉一大块轮换和重试代码。适合想省事、对接简单、要求连续性的场景。

一句话:要控制力选短效,要省心选隧道。

三、实操:三种常见栈的对接

requests + 短效代理

import requests ​ # 从提取接口拿到的一条 ip:port,带认证就用 user:pass@ proxy = "http://username:password@123.45.67.89:8000" proxies = {"http": proxy, "https": proxy} ​ resp = requests.get( "https://target.example.com/list", proxies=proxies, headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ..."}, # 别用默认 UA timeout=10, ) print(resp.status_code)

拿到一批 IP 后,轮换最简单的做法是用itertools.cycle轮流取,遇到失败就标记跳过。

requests + 隧道代理

隧道更简单,所有请求都指向同一个隧道地址,换 IP 在服务端完成:

tunnel = "http://username:password@tunnel.example.com:6000" proxies = {"http": tunnel, "https": tunnel} # 之后正常请求即可,每个请求的出口 IP 由服务端自动轮换

Scrapy

Scrapy 用中间件注入代理:

# middlewares.py class ProxyMiddleware: def process_request(self, request, spider): request.meta["proxy"] = "http://username:password@tunnel.example.com:6000" # settings.py DOWNLOADER_MIDDLEWARES = { "myproject.middlewares.ProxyMiddleware": 543, }

Selenium

带认证的代理稍麻烦,Chrome 原生的--proxy-server不支持user:pass写法,实务上用 selenium-wire:

from seleniumwire import webdriver ​ options = { "proxy": { "http": "http://username:password@tunnel.example.com:6000", "https": "http://username:password@tunnel.example.com:6000", } } driver = webdriver.Chrome(seleniumwire_options=options) driver.get("https://target.example.com")

四、实测:用极安隧道跑一遍,看真实数据

接上了不等于有效。宣传参数谁都会写,下面是我们用极安代理的隧道实际跑出来的一组数,你可以拿同样的脚本自己复现。

  • 测试对象:极安代理 隧道代理(套餐:299元/月)

  • 测试时间:9:00–11:00(早高峰时段)

  • 样本:连续 200 个请求

  • 可用的定义:返回 HTTP 200 且能取到出口 IP

  • 测试环境:本地笔记本

可用率脚本:

import requests, concurrent.futures ​ def check(_): try: r = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=8) return r.status_code == 200 except Exception: return False ​ with concurrent.futures.ThreadPoolExecutor(max_workers=20) as ex: results = list(ex.map(check, range(200))) ​ print(f"可用率: {sum(results) / len(results):.1%}")

下面是这次实测的结果(这一组是带宽、速度、延迟、成功率维度):

指标极安实测说明
IP 请求传递成功率98.93%表现好,连接基本不掉
带宽4.23 Mbps带宽高,常规采集够用
平均下载速度533.6 KB/s跟带宽匹配,拉页面不吃力
稳定性(延迟方差)2.1数值越小越稳,这里属于偏稳
延迟 最小 / 平均 / 最大205 / 2633 / 14773 ms短板:平均偏高,最大值冲到近 15 秒,尾部抖动明显

结论:极安代理在连接成功率上很稳,实测是 98.93%,运行过程不易断线,带宽与下载速度可覆盖常规采集需求。平均延迟 2.6 秒,峰值最高 15 秒,存在小幅波动。

五、换了代理还是被封,为什么?

代理只解决 IP 维度的封禁。如果目标站靠的是指纹和行为识别,换再多 IP 也没用,还得配合:

  • 合理的 User-Agent 和 Header,别用库默认值

  • 控制频率、加随机间隔,别打出机器人节奏

  • 需要时上真实浏览器渲染(Playwright / Selenium)处理 JS 和指纹

  • 维护 Cookie 和会话状态

代理是基础设施,不是银弹。把它和上面这些配合,成功率才稳。

六、合规提醒

数据采集的合规边界要守住:遵守目标站的 robots 协议和服务条款,不采集个人隐私和受保护数据,控制频率避免影响对方正常服务。代理应用于合规数据采集、合规测试、企业网络验证等正当场景。技术中立,怎么用是使用者的责任。

小结

被封先别急着买代理,先换网测试确认是不是 IP 问题;是的话,按场景在短效和隧道之间选型,按上面的代码对接;接上之后务必自测可用率、IP 类型和目标站成功率,用数据而不是宣传参数做判断;最后记住代理解决不了指纹和行为问题,要配合降频、改 Header、真实渲染一起用。把这套跑顺,采集成功率才能真正稳下来。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询