代理服务商宣传的是池子规模:数百万个IP,数亿个IP。池子规模确实重要,但它掩盖了另一个对可靠性同样重要的问题:这些地址来自多少个不同的网络。一千万个IP如果集中在少数几个网络上,其表现会与分散在数千个网络上的一千万个IP截然不同。
ASN多样性指的是代理池的地址在不同网络间分布的广度。每个IP地址都属于某个组织运营的网络,由自治系统号(ASN)标识。多样化的池子从许多网络中引出出口节点,没有哪一个网络占据过大份额;而集中化的池子则主要落在少数几个网络上。
对于住宅代理而言,ASN通常是某个消费级互联网服务商。本文将解释为什么池子在ASN间的分布广度很重要,如何用一个免费的Python脚本从出口节点样本中测量这一点,以及如何解读这些数字,我们将使用自己基准测试中的真实数据。
为什么ASN多样性对代理可靠性至关重要
网站和反机器人系统很少单独评判一个IP地址,它们会结合上下文来判断,而网络正是它们掌握的最有力的上下文信息之一。
- 封锁按网络扩散。 当某个网站发现来自同一网络的多个地址存在滥用行为时,它可能对整个网络进行限速或发起挑战验证。集中在少数几个ASN上的池子正面临这种风险:一个网络层面的决定就能影响你大部分的流量。
- 信誉是共享的。 同一网络上的地址会继承该网络的部分信誉。当某个网络信誉下降时,多样化的池子受到的影响更小。
- 托管网络会暴露身份。 如果一个”住宅”池子中有相当比例的地址落在托管或数据中心网络上,那它就不是真正的住宅代理,网站也会据此区别对待这些地址。
- 本地真实性需要本地网络。 如果你采集的数据要呈现某个国家或城市的视角,那么出口节点就应该分布在当地人实际使用的各家服务商上。
这也是为什么针对特定网络进行定向在某些工作场景中很有用的原因。我们关于住宅代理的ASN定向的指南介绍了何时应该将请求固定到某一家服务商,这是相反的情况:针对特定测试的刻意集中。
一个多样化的住宅池应该是什么样子
真实的互联网市场本身就是集中的。在大多数国家,少数几家大型服务商服务着大部分家庭,背后跟着一条由较小的区域性和移动网络组成的长尾。健康的住宅池应该反映这种结构:少数几家大型消费级ISP承载相当份额的出口节点,背后还有许多较小的网络。
所以目标并不是各网络份额完全均等,而是两件事:
- 没有单一网络占据主导地位,超出该国互联网市场本身能解释的程度。
- 存在长尾: 许多不同的网络,使得任何一个网络被封锁都只会影响一小部分流量。
如何测量代理池的ASN多样性
你无法看到服务商的整个池子,但可以对其进行抽样。通过轮换网关发送请求,记录每个请求的出口IP和所属网络,然后对样本计算集中度指标。
四个指标涵盖了大部分重要内容:
| 指标 | 衡量内容 | 如何解读 |
|---|---|---|
| 不同ASN数 | 样本中出现了多少个不同网络 | 越高越好;随样本量增长 |
| 前1和前5份额 | 最大的一个和五个网络所占出口节点的份额 | 越低意味着受单一网络决策的影响越小 |
| 赫芬达尔-赫希曼指数(HHI) | 份额平方和,从接近0(分散)到1(单一网络) | 衡量市场集中度的标准指标 |
| 有效ASN数 | 1/HHI:样本的表现相当于多少个规模相等的网络 | 最直观的单一数值 |
再加一个与集中度无关的检查:非住宅网络上的出口节点所占份额。对于住宅池来说,这个数值应该接近零。
将下面的模块保存为asn_diversity.py。它通过代理使用ip-info.com(我们提供的免费IP地理定位API)对出口节点进行抽样,该API会返回每个地址的ASN、网络名称以及它是住宅网络还是托管网络,并计算相关指标:
# asn_diversity.py
from collections import Counter
import requests
def sample_exit(proxy_url, get=requests.get):
"""One exit through a rotating proxy: its IP, network (ASN) and network type."""
info = get("http://ip-info.com/json", proxies={"http": proxy_url, "https": proxy_url}, timeout=20).json()
return {"ip": info["ip"], "asn": info["asn"], "as_name": info["as_name"], "user_type": info.get("user_type")}
def diversity(exits):
"""How spread out a sample of exits is across networks."""
exits = list({e["ip"]: e for e in exits}.values()) # count each IP once
counts = Counter(e["asn"] for e in exits)
n = len(exits)
shares = sorted((c / n for c in counts.values()), reverse=True)
hhi = sum(s * s for s in shares) # Herfindahl-Hirschman index, 0 to 1
return {
"unique_ips": n,
"asns": len(counts),
"top1_share": round(shares[0], 3),
"top5_share": round(sum(shares[:5]), 3),
"hhi": round(hhi, 4),
"effective_asns": round(1 / hhi, 1), # as many equal-sized networks as this
"non_residential_share": round(sum(e["user_type"] != "residential" for e in exits) / n, 3),
}
两个1,000个出口节点的示例样本展示了宽泛与狭窄的池子表现有多大差异(这是合成数据,并非真实服务商):
import random
from asn_diversity import diversity
random.seed(7)
# Illustrative samples of 1,000 exits from two pools (synthetic, not real providers)
broad = [{"ip": f"ip{i}", "asn": random.choice(range(60)), "user_type": "residential"} for i in range(1000)]
narrow = [{"ip": f"ip{i}", "asn": random.choice([1, 1, 1, 1, 2, 2, 3, 4]), "user_type": "residential"}
for i in range(1000)]
print("broad ", diversity(broad))
print("narrow", diversity(narrow))
broad {'unique_ips': 1000, 'asns': 60, 'top1_share': 0.028, 'top5_share': 0.125, 'hhi': 0.0176, 'effective_asns': 57.0, 'non_residential_share': 0.0}
narrow {'unique_ips': 1000, 'asns': 4, 'top1_share': 0.506, 'top5_share': 1.0, 'hhi': 0.3466, 'effective_asns': 2.9, 'non_residential_share': 0.0}
宽泛的池子表现得就像57个规模相等的网络,其最大网络占出口节点的比例不到3%。狭窄的池子表现得还不到三个网络:一半的出口节点落在同一个网络上,而所有出口节点都落在四个网络之一。在这个狭窄的池子上,针对最大ASN的单次网络层面封锁就会阻断你一半的请求。
通过网关收集1,000个真实出口节点
要测量真实的池子,将sample_exit指向一个轮换网关并并行收集样本。使用Shifter时,国家信息放在用户名中,且每个不带会话ID的请求都会获得一个新的出口节点:
from concurrent.futures import ThreadPoolExecutor
from asn_diversity import diversity, sample_exit
PROXY = "http://customer-USERNAME-country-gb:PASSWORD@p.shifter.io:443"
def safe_sample(_):
try:
return sample_exit(PROXY)
except Exception:
return None # skip the odd timeout
with ThreadPoolExecutor(max_workers=20) as pool:
exits = [e for e in pool.map(safe_sample, range(1000)) if e]
print(diversity(exits))
对你要比较的每一家服务商,都用相同的脚本、相同的样本量、在同一时段运行测试。
子网(/24)多样性
ASN并非唯一重要的分组方式。网站也会封锁整个地址段,最常见的是/24子网(IPv4地址的前三段数字)。同一/24网段上的两个出口节点通常共享同一栋楼、同一条街道或同一个运营商级NAT,所以封锁其中一个往往也会连带封锁另一个。在同一样本上加两行代码即可统计:
subnets = Counter(".".join(e["ip"].split(".")[:3]) for e in exits)
print("distinct /24 subnets:", len(subnets), "largest subnet share:", round(max(subnets.values()) / len(exits), 3))
健康的住宅样本中,不同/24子网的数量应该接近不同IP的数量。
如何获得公平的ASN样本
几项预防措施能保证测量结果的可靠性:
- 按国家抽样。 多样性只有在某个市场内部才有意义。混合不同国家会人为抬高ASN数量,却无法说明任何一个市场的真实情况。
- 使用足够多的请求。 不同ASN的数量会随样本量持续增长,所以要在相同样本量下比较各个池子。每个国家1,000个出口节点是一个合理的起点;份额和HHI会比计数更快趋于稳定。
- 每个IP只计一次。 轮换池可能会多次返回同一个地址。上面的模块通过IP去重处理了这一点。
- 将抽样分散到一段时间内进行。 住宅池在一天之中会随设备上下线而变化。分几个小时抽样比一次性集中抽样更能反映真实情况。
- 对每个池子使用相同的查询数据源。 不同的地理定位数据库可能将同一地址归属到略有不同的网络。
我们的基准测试发现了什么
我们在住宅代理基准测试的每次运行中统计不同的ASN数量:Shifter和另外16个网络,每个国家都发送相同数量的请求,均来自同一台服务器。这些样本远大于1,000个出口节点(美国为250,000次请求,其他地区为60,000到100,000次),所以这些计数会比小规模测试显示的数字高得多,但各服务商之间是可以比较的。
在美国,五个分布最广的池子是:
| 网络 | 不同美国ASN数 | 在线美国IP数 |
|---|---|---|
| Shifter | 1,828 | 212,212 |
| Oxylabs | 1,591 | 140,811 |
| Decodo | 1,578 | 138,914 |
| Webshare | 1,518 | 150,512 |
| FleetProxy | 1,482 | 112,402 |
在我们测试的五个国家中,Shifter与池子规模方面最强的竞争对手Webshare相比如下:
| 国家 | Shifter ASN数 | Webshare ASN数 |
|---|---|---|
| 美国 | 1,828 | 1,518 |
| 英国 | 166 | 209 |
| 法国 | 147 | 96 |
| 加拿大 | 308 | 245 |
| 德国 | 272 | 188 |
英国是唯一一个Webshare分布更广的市场:209个网络对166个,相差43个。在同一次测试中,Shifter返回的在线英国地址更多,60,487个对51,564个,而我们测试的这个池子起价为每GB $0.75,相比Webshare公开的最低价格$1.40,价格略高于一半。Shifter在德国的实测数据则与英国相反:在线IP数量少于Webshare,但网络数为272个对188个。
日常使用ASN数据
一旦你能够测量ASN分布广度,同样的数据在日常工作中也能发挥作用,而不仅限于选择服务商:
- 按网络分析失败情况。 当封锁率上升时,按出口节点的ASN对失败请求进行分组。如果失败集中在一两个网络上,说明目标网站正在针对这些网络采取行动,分散或排除这些网络比单纯重试更能解决问题。
- 在大任务开始前检查池子。 在目标国家快速抽取1,000个出口节点样本,可以判断当地的池子是否足够宽泛以应对你计划发送的流量。
- 仅在任务需要时才固定网络。 有些测试,比如检查某个服务商的客户看到的内容,就是需要刻意集中。ASN定向正是为此而设,上面链接的指南介绍了何时值得这样做。
- 为每条结果记录ASN。 当数据集中某个数字看起来不对劲时,了解它是从哪个网络观测到的往往就是答案所在。
ISP代理与网络分布
同样的思路也适用于你长期持有的IP。如果你购买ISP代理用于长会话,将它们分散到多家服务商和多个城市上,可以避免把所有身份都集中在同一个网络上。我们关于购买ISP代理避免浪费资金的指南中包含了一个用于检查试用IP批次的脚本,而我们的ISP代理服务让你可以为每个IP选择城市和ISP(ASN),覆盖1,800多个城市的900多家ISP。服务商如何采购地址也会影响多样性;我们关于服务商如何合乎道德地采购住宅IP的说明文章介绍了需要询问哪些问题。
常见问题
什么是代理网络中的ASN多样性?
指的是代理池的IP地址在不同网络(自治系统)间分布的广度。多样化的池子拥有许多网络,没有哪一个占据主导地位;集中化的池子则大部分地址都落在少数几个网络上。
为什么ASN多样性对抓取很重要?
网站往往针对整个网络采取行动,而不是单个地址。如果你的大部分出口节点共享同一个网络,一次网络层面的封锁就可能影响你大部分的请求。
如何测量ASN多样性?
通过代理发送一批样本请求,记录每个出口节点的ASN,然后计算最大网络的份额、赫芬达尔-赫希曼指数以及有效网络数量。要按国家抽样,分时段进行,并且在比较不同池子时使用相同的样本量。
更大的代理池是否总是意味着更高的多样性?
不一定。一个庞大的池子仍可能集中在少数几个网络上。池子规模和网络多样性是两个独立的测量维度。
有效ASN数多少算好?
没有一个固定的目标值,因为这取决于该国互联网市场本身的集中程度。应在同一国家、相同样本量下比较各服务商:有效ASN数更高、最大网络份额更低的池子韧性更强。
应该抽样多少个出口节点?
每个国家抽取1,000个唯一出口节点是一个合理的起点。份额、HHI和有效ASN数会较快趋于稳定;而不同ASN的原始计数会随样本量持续增长,所以只应比较在相同样本量下得出的计数。
什么是子网多样性,它与ASN多样性有何不同?
子网多样性统计的是样本覆盖了多少个不同的/24地址段。ASN多样性关注的是网络层面;子网多样性关注的是网络内部的”社区”层面。网站在这两个层面都会实施封锁,所以好的池子应该在两方面都足够宽泛。
在你们的基准测试中,哪家服务商的ASN分布最广?
在美国,Shifter覆盖了1,828个不同网络,是我们测量的17个网络中最高的,其次是Oxylabs的1,591个。Shifter在法国和加拿大也覆盖了最多的网络,在德国与Rayobyte并列第一;而在英国,Webshare覆盖的网络更多,209个对166个。
总结
IP数量衡量的是池子的规模,而ASN多样性衡量的是池子的韧性。应按国家抽样出口节点,每个IP只计一次,并关注有效网络数量、最大网络份额、子网分布广度以及非住宅出口节点的占比。健康的住宅池应该反映当地互联网市场的真实结构:少数几家大型消费级ISP加上背后的一条长尾,没有哪一个网络占据你流量中过大的份额。