スクレイピングエンジニアにとって、IPバインドされたセッション状態が壊れる問題は日常的な障害です。ログイン後のCSRFトークン、ショッピングカートの状態、ページネーションの継続トークンなど、多くのWebアプリケーションはリクエスト元IPを検証します。ここでスティッキープロキシセッションとローテーティングプロキシセッションの違いを理解し、正しく制御することが、スクレイピングの成功率を左右します。
スティッキープロキシセッションとローテーティングプロキシセッションの核心的な違い
スティッキープロキシセッションとローテーティングプロキシセッションの違いは、出口IPの保持期間にあります。ローテーティングプロキシは、ゲートウェイがリクエストごとに新しい出口IPを割り当てる仕組みです。一方、スティッキーセッションは、固定TTL(通常1〜30分)の間、1つの住宅IPを維持します。
| 特徴 | ローテーティング(回転) | スティッキー(固定) |
|---|---|---|
| 出口IPの保持 | リクエストごとに変更 | TTL期間中は同一IP |
| 典型的なTTL | なし(1リクエスト限り) | 1〜30分 |
| IPバインド状態の維持 | 不可 | 可能 |
| 適した用途 | 大量の公開データ収集 | ログインフロー、カート操作、マルチステップ処理 |
| ブロック耐性 | 高い(IP分散) | TTL内はIP固定のため要管理 |
ローテーティングプロキシセッションの仕組みを簡単に説明すると、プロキシゲートウェイがプール内のIPを順次またはランダムに割り当てるため、同じターゲットサイトから見るとリクエスト元が常に変化します。これはIPベースのレートリミットを回避するのに有効ですが、IPに紐づくセッション状態を維持できません。
なぜこの問題が存在するのか — 技術的背景
多くのWebアプリケーションは、セキュリティ上の理由でリクエスト元IPをセッション状態の検証に使用します。これは以下のシナリオで顕著です。
- ログインセッション:認証後に発行されるセッションCookieがIPアドレスに紐づいている場合、IPが変わると即座に無効化される。
- CSRFトークン:フォーム送信時に発行されるワンタイムトークンがIPと紐づいて検証される。
- ショッピングカート:ECサイトのカート状態がサーバーサイドでIPに紐づけて管理されている。
- ページネーショントークン:検索結果の次ページトークンが、最初のリクエスト元IPでのみ有効。
これらはすべて、IPが途中で変わるとセッションが破綻するケースです。Mozilla Developer NetworkのHTTP Cookieのドキュメントでも説明されている通り、Cookie自体はIPに依存しませんが、サーバーサイドの実装がIPバインドを行うことは一般的です。だからこそ、住宅IPスティッキーセッションが必要になります。
ProxyHatでのセッション制御 — ユーザー名エンコーディング
ProxyHatでは、セッション制御をプロキシユーザー名にエンコードします。これにより、コードを変更せずにURLだけでローテーティングとスティッキーを切り替えられます。
デフォルトのローテーティングエンドポイント
ユーザー名にセッション指定がない場合、ProxyHatはリクエストごとに新しい出口IPを割り当てます。
http://USERNAME:PASSWORD@gate.proxyhat.com:8080
このエンドポイントでは、各HTTPリクエストが異なる住宅IPから送信されます。大量の公開データ収集に最適です。
スティッキーセッションの指定
ユーザー名に -session-abc123 トークンを追加すると、指定したセッションIDに対応するIPがTTL期間中固定されます。geo-targetingと組み合わせることも可能です。
http://user-session-abc123-country-US:pass@gate.proxyhat.com:8080
この例では、米国の住宅IPをセッションID abc123 に紐付けて固定します。同じセッションIDを使い続ける限り、同じ出口IPが維持されます。
都市レベルのgeo-targetingも可能です。
http://user-session-abc123-country-DE-city-berlin:pass@gate.proxyhat.com:8080
詳細な設定についてはProxyHat公式ドキュメントを参照してください。
実装例 — ローテーティングとスティッキーの使い分け
Python requests でのリクエスト単位ローテーション
以下は、各リクエストで異なるIPを使用するシンプルな例です。公開データの大量収集に適したパターンです。
import requests
url = "http://httpbin.org/ip"
proxy_url = "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
proxies = {"http": proxy_url, "https": proxy_url}
for i in range(5):
resp = requests.get(url, proxies=proxies, timeout=15)
print(f"Request {i+1}: {resp.json()['origin']}")
このコードでは、5回のリクエストがそれぞれ異なる出口IPから送信されます。IPベースのレートリミットに引っかかりにくく、SERPトラッキングや価格モニタリングのようなステートレスな収集に最適です。SERPトラッキングのユースケースも参照してください。
Node.js でのマルチステップフローにおけるスティッキーセッション
ログイン → カート追加 → チェックアウトのようなマルチステップフローでは、同一IPを維持する必要があります。以下はNode.jsでの実装例です。
const axios = require("axios");
const { HttpsProxyAgent } = require("https-proxy-agent");
const sessionId = "order-flow-001";
const proxyUrl = `http://user-session-${sessionId}-country-US:pass@gate.proxyhat.com:8080`;
const agent = new HttpsProxyAgent(proxyUrl);
const client = axios.create({
httpsAgent: agent,
proxy: false,
timeout: 20000,
});
// Step 1: ログイン
const loginRes = await client.post("https://example.com/api/login", {
email: "user@example.com",
password: "secret",
});
const cookies = loginRes.headers["set-cookie"];
// Step 2: カートに追加(同一IP、同一セッション)
await client.post("https://example.com/api/cart/add", {
productId: 12345,
quantity: 1,
}, {
headers: { Cookie: cookies.join("; ") },
});
// Step 3: チェックアウト(同一IPを維持)
const checkoutRes = await client.post("https://example.com/api/checkout", {
shippingAddress: "123 Main St",
}, {
headers: { Cookie: cookies.join("; ") },
});
console.log(checkoutRes.data);
この例では、セッションID order-flow-001 が3つのステップすべてで同じ出口IPを維持します。サーバーサイドでIPバインドされたセッション検証が行われていても、フロー全体が正常に完了します。
運用ガイダンス — TTLチューニング、リサイクル、並列セッション
セッションTTLのチューニング
スティッキーセッションのTTLは、対象フローの所要時間に合わせて調整すべきです。目安として:
- ログイン+1ページ取得:5分程度で十分
- マルチステップチェックアウト:10〜15分を推奨
- 長時間のクロール:30分でローテーションし、新しいセッションIDで再開
TTLが短すぎるとフロー途中でIPが変わり、長すぎると同一IPからの大量リクエストがブロックの対象になります。
429/403時のセッションリサイクル
スティッキーセッションで429(Too Many Requests)または403(Forbidden)を受信した場合、即座にセッションIDを変更して新しいIPに切り替えるべきです。実装パターンの例:
import requests
import uuid
def make_request_with_retry(url, max_retries=3):
for attempt in range(max_retries):
session_id = uuid.uuid4().hex[:12]
proxy_url = f"http://user-session-{session_id}-country-US:pass@gate.proxyhat.com:8080"
proxies = {"http": proxy_url, "https": proxy_url}
try:
resp = requests.get(url, proxies=proxies, timeout=15)
if resp.status_code in (429, 403):
print(f"Attempt {attempt+1}: {resp.status_code}, recycling session...")
continue
return resp
except requests.exceptions.RequestException:
continue
return None
このパターンでは、429/403を受けるたびに新しいセッションIDを生成し、新しいIPに切り替えます。これにより、ブロックされたIPからの継続リクエストを回避できます。
並列セッション数の目安
並列スティッキーセッションの数は、ターゲットサイトの許容量とProxyHatのプールサイズに依存します。実務的な目安として、1つのターゲットドメインに対して50〜100の並列セッションを維持しつつ、各セッション内でリクエスト間隔を1〜3秒空けるバランスが効果的です。これにより、1秒あたり150〜300リクエスト程度のスループットを確保しつつ、ブロック率を低く抑えられます。
ProxyHatのロケーション一覧を活用し、複数の国・都市にまたがってセッションを分散させることで、単一IPレンジからの不自然な集中を防げます。
ローテーティングが勝るケース — 大量公開データスクレイピング
すべてのケースでスティッキーセッションが優れているわけではありません。以下のシナリオでは、ローテーティングが明確に優位です。
- SERPスクレイピング:検索結果ページはステートレスであり、IPバインドの必要がない。1リクエストごとにIPを変えることで、レートリミットに到達しにくい。
- 価格比較:複数のECサイトから商品ページを取得する場合、各ページは独立しており、IP固定の必要がない。
- AI学習データ収集:大量の公開Webページを収集する場合、ステートレスなローテーションが最も効率的。
これらのケースでは、1つのIPあたりのリクエスト数を最小化することがブロック回避の鍵となります。ローテーティングにより、IPプール全体に負荷を分散できます。Webスクレイピングのユースケースで詳しいパターンを確認できます。
法的・倫理的考慮事項
プロキシの使用は技術的に可能であっても、常に法的・倫理的枠組みの中で行う必要があります。以下の点に留意してください。
- robots.txtの尊重:ターゲットサイトのrobots.txtでクロールが禁止されているパスへのアクセスを避ける。
- 利用規約(ToS):スクレイピングを禁止するToSがある場合、その遵守を検討する。米国ではComputer Fraud and Abuse Act(CFAA)の観点から「認可されていないアクセス」の解釈に注意が必要。
- GDPR / CCPA:個人データの収集・処理にはEUのGDPRやカリフォルニア州のCCPAが適用される可能性がある。欧州委員会のデータ保護ページも参照。
- レート制限の遵守:ターゲットサイトのインフラに過負荷をかけないよう、適切な間隔でリクエストを送信する。
スクレイピングの法的環境は国や管轄によって異なり、常に変化しています。本記事の内容は技術的ガイダンスであり、法的助言ではありません。重要な判断については専門家に相談してください。
ビルド vs バイのROI計算
プロキシ基盤を自前で構築するか、ProxyHatのようなサービスを利用するかの判断は、ROI計算で明確になります。具体例を見てみましょう。
自前構築の想定コスト:
- 10,000IPの住宅プロキシプール維持:月額約$3,000〜$8,000(IPソース、インフラ、メンテナンス含む)
- エンジニアリング工数:2名が月40時間をプロキシ管理に費やす — 機会コスト約$8,000/月
- 合計:月額約$11,000〜$16,000
ProxyHat利用の想定コスト:
- 従量制または定額プラン:料金ページを参照
- エンジニアリング工数:セッション管理の実装のみ — 月10〜20時間
自前構築の場合、IPの枯渇、品質低下、ブロック対応に継続的なエンジニアリングリソースが必要です。一方、マネージドサービスはIPプールの品質管理とローテーション基盤を提供するため、チームはスクレイピングロジックとデータ品質に集中できます。月間10万リクエスト以上を処理する場合、バイモデルのコスト優位性が顕著になります。
Key Takeaways
スティッキーセッションはIPバインドされたセッション状態(ログイン、カート、CSRF、ページネーション)を維持するために不可欠。TTLは対象フローの所要時間に合わせて調整する。
ローテーティングはステートレスな大量収集(SERP、価格比較、AI学習データ)で最も効果的。1リクエストごとにIPを変えることでレートリミットを回避。
セッション制御はProxyHatのユーザー名エンコーディングで完結する。
-session-abc123でスティッキー、未指定でローテーティング。geo-targeting(-country-US、-city-berlin)も同時に指定可能。429/403時のリサイクルは必須。新しいセッションIDを生成し、即座に新しいIPに切り替える。
並列セッションは1ドメインあたり50〜100を上限とし、各セッション内で1〜3秒の間隔を空ける。複数のgeo-locationに分散させる。
まとめ
スティッキープロキシセッションとローテーティングプロキシセッションは、用途によって明確に使い分けるべきツールです。IPバインドされたセッション状態を維持する必要があるマルチステップフローではスティッキーセッションが必須であり、ステートレスな大量収集ではローテーティングが最適です。
ProxyHatでは、ユーザー名のエンコーディングだけで両者を切り替えられるため、コードの複雑化を最小限に抑えつつ、両方のパターンを並行運用できます。まずは料金プランを確認し、対象ユースケースに合わせたプロキシタイプを選択してください。






