プロキシプロバイダーはプール規模を宣伝する。数百万のIP、数億のIP。プール規模は重要だが、信頼性にとって同じくらい重要な、もう一つの疑問を覆い隠している。それは、それらのアドレスがどれだけ多様なネットワークから来ているかということだ。一握りのネットワーク上にある1,000万のIPのプールは、数千のネットワークに分散したプールとはまったく異なる振る舞いをする。
ASNの多様性とは、プロキシプールのアドレスがどれだけ広く異なるネットワークに分散しているかを示すものだ。すべてのIPアドレスは、ある組織が運営し自律システム番号(ASN)で識別されるネットワークに属している。多様なプールは多くのネットワークから出口を得ており、突出したシェアを持つネットワークが一つもない。集中したプールはほとんどが少数のネットワーク上にある。
レジデンシャルプロキシの場合、ASNは通常、一般消費者向けのインターネットプロバイダーである。この記事では、プールがASN間でどう分散しているかがなぜ重要なのか、無料のPythonスクリプトを使って出口のサンプルからそれをどう測定するか、そして自社のベンチマークから得た実際の数値を使ってその数値をどう読み解くかを説明する。
ASNの多様性がプロキシの信頼性にとってなぜ重要か
ウェブサイトやアンチボットシステムは、IPアドレスを単独で判断することはめったにない。文脈の中で判断するのであり、ネットワークはその文脈の中でも最も強力な手がかりの一つである。
- ブロックはネットワーク単位で広がる。 あるサイトが一つのネットワーク上の多数のアドレスから不正行為を検知すると、そのネットワーク全体にレート制限やチャレンジを課すことがある。少数のASNに集中したプールはこれにさらされやすい。一つのネットワークレベルの判断が、トラフィックの大部分に影響するからだ。
- 評判は共有される。 同じネットワーク上のアドレスは、そのネットワークの評判をある程度引き継ぐ。多様なプールは、一つのネットワークの評判が下がった場合の影響を受けにくい。
- ホスティングネットワークは正体を明かしてしまう。 アドレスのかなりの割合がホスティングやデータセンターのネットワーク上にある「レジデンシャル」プールは、実際には完全にレジデンシャルとは言えず、サイト側もそれに応じてそれらのアドレスを扱う。
- 地域のリアリズムには地域のネットワークが必要だ。 ある国や都市から見えるようにデータを収集する場合、出口はその地域の人々が実際に使っているプロバイダーに分散しているべきである。
これが、一部の作業では特定のネットワークをターゲットにすることが有用な理由でもある。レジデンシャルプロキシのためのASNターゲティングに関する当社のガイドでは、リクエストを一つのプロバイダーに固定するのが適切な場合を取り上げている。これは逆のケース、つまり特定のテストのために意図的に集中させる場合だ。
多様なレジデンシャルプールはどうあるべきか
実際のインターネット市場は集中している。ほとんどの国では、少数の大手プロバイダーが大多数の世帯にサービスを提供し、その背後に小規模な地域系やモバイル系のネットワークのロングテールが続く。健全なレジデンシャルプールはこの形を反映する。つまり、出口のかなりの割合を占める少数の大手消費者向けISPと、その背後に多数の小規模ネットワークが存在する形だ。
したがって目標は、ネットワーク間でシェアが完全に均等であることではない。重要なのは次の2点だ。
- 単一のネットワークが支配的にならないこと。 その国のインターネット市場の実情で説明できる範囲を超えないこと。
- ロングテールが存在すること。 多数の異なるネットワークがあり、そのうちどれか一つがブロックされてもトラフィックのごく一部にしか影響しないこと。
プロキシプールのASN多様性を測定する方法
プロバイダーのプール全体を見ることはできないが、サンプリングすることはできる。ローテーティングゲートウェイ経由でリクエストを送り、各リクエストがどのIPとネットワークから出たかを記録し、そのサンプルについて集中度の指標を計算する。
重要な点のほとんどは、次の4つの指標でカバーできる。
| 指標 | 測定する内容 | 読み方 |
|---|---|---|
| 異なるASNの数 | サンプルに現れるネットワークの数 | 高いほど良い。サンプルサイズとともに増加する |
| トップ1およびトップ5のシェア | 最大のネットワーク1つ、または5つに属する出口の割合 | 低いほど、一つのネットワークの判断にさらされるリスクが小さい |
| ハーフィンダール・ハーシュマン指数(HHI) | シェアの二乗和。0に近いほど分散、1なら単一ネットワーク | 市場集中度の標準的な指標 |
| 実効ASN数 | 1 / HHI。サンプルが何個の同規模ネットワークのように振る舞うか | 最も直感的な単一の数値 |
集中度とは別に、もう一つチェックすべき点がある。それは非レジデンシャルネットワーク上にある出口の割合だ。レジデンシャルプールであれば、これはゼロに近いはずである。
以下のモジュールをasn_diversity.pyとして保存する。これは、無料のIPジオロケーションAPIであるip-info.comを使ってプロキシ経由で出口をサンプリングする。この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件の出口からなる2つの例示用サンプルを示す(合成データであり、実在のプロバイダーのものではない)。
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%未満しか占めていない。狭いプールは3個未満のネットワークのように振る舞い、全出口の半数が一つのネットワーク上にあり、すべての出口が4つのネットワークのいずれかに属している。狭いプールでは、最大の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アドレスの最初の3つの数字)をブロックすることも多い。同じ/24上の2つの出口は、たいてい同じ建物、同じ通り、または同じキャリアグレードNATを共有しているため、一方へのブロックがもう一方も巻き込むことが多い。同じサンプルに2行を追加するだけでそれを数えられる。
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国あたり1,000件の出口は妥当な出発点であり、シェアやHHIはこの数よりも早く安定する。
- 各IPを一度だけ数える。 ローテーティングプールは同じアドレスを複数回返すことがある。上記のモジュールはIPで重複排除する。
- サンプルを時間的に分散させる。 レジデンシャルプールは、デバイスの出入りに伴い一日を通して変化する。数時間にわたってサンプリングする方が、一度にまとめて取得するよりも正確な像が得られる。
- すべてのプールで同じ照会元を使う。 異なるジオロケーションデータベースは、同じアドレスでもわずかに異なるネットワークに帰属させることがある。
当社のベンチマークで分かったこと
当社ではレジデンシャルプロキシベンチマークの各実行において、異なるASNの数を数えている。Shifterと他の16のネットワークに対し、同じサーバーから国ごとに同じ数のリクエストを送った。これらのサンプルは1,000件の出口よりもはるかに大規模であり(米国では250,000リクエスト、その他の地域では60,000から100,000リクエスト)、そのため件数は小規模なテストよりもはるかに大きくなるが、プロバイダー間での比較は可能である。
米国では、最も広いプール上位5件は以下の通りだった。
| ネットワーク | 米国の異なる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 |
当社がテストしている5か国を通して、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であった。また、当社がテストしたプールは1GBあたり$0.75からの価格であるのに対し、Webshareの最安公開価格は$1.40であり、その半分強の価格である。ドイツにおけるShifterの測定値は英国とは逆で、ライブIP数はWebshareより少なかったが、ネットワーク数は272対188だった。
ASNデータを日々の業務で使う
ASNの分散を測定できるようになれば、同じデータはベンダー選定だけでなく、日々の業務にも役立つ。
- 失敗をネットワーク別に読み解く。 ブロック率が上がったら、失敗したリクエストをその出口のASNごとにグループ化する。失敗が1つか2つのネットワークに集中している場合、ターゲットはそれらのネットワークに対して対策を講じているということであり、それらを分散させるか除外する方が、再試行するよりも効果的に問題を解決する。
- 大きな案件の前にプールを確認する。 ターゲット国での1,000件程度の簡単なサンプルで、そのプールが計画しているボリュームに対して十分に広いかどうかが分かる。
- 必要な場合にのみネットワークを固定する。 あるプロバイダーの顧客が実際に何を見ているかを確認するなど、意図的に集中させることが求められるテストもある。ASNターゲティングはそのためのものであり、上記リンク先のガイドがどのような場合にそれが有効かを扱っている。
- すべての結果にASNを記録する。 データセット内のある数値がおかしく見えるとき、どのネットワークから観測されたものかを知ることが、しばしばその説明になる。
ISPプロキシとネットワークの分散
同じ考え方は、長期間保持するIPにも当てはまる。長時間のセッションのためにISPプロキシを購入する場合、複数のプロバイダーと都市に分散させることで、すべてのアイデンティティを一つのネットワークに集中させることを避けられる。お金を無駄にせずISPプロキシを購入する方法に関する当社のガイドには、トライアルIPのバッチをチェックするためのスクリプトが含まれており、当社のISPプロキシでは、900以上のISP、1,800以上の都市にわたって、IPごとに都市とISP(ASN)を選択できる。プロバイダーがアドレスをどのように調達するかも多様性を左右する。プロバイダーが倫理的にレジデンシャル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とその背後に続くロングテールがあり、どのネットワークもトラフィックの過大なシェアを占めていない状態だ。